MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLでSELECT INTOの代替となる方法とは?CREATE TABLE AS SELECT文の使い方を徹底解説

SQL Serverなどではテーブル間でデータをコピーする際にSELECT INTO文が使われますが、MySQLにはこの構文が存在しません。その代わりとなるのがCREATE TABLE AS SELECT(CTAS)文です。この記事では、基本的な構文から実際の動作例まで、わかりやすく解説します。

CREATE TABLE AS SELECT文の基本構文

既存のテーブルから新しいテーブルを作成し、データを同時にコピーするには、以下の構文を使用します。

CREATE TABLE 新しいテーブル名 AS SELECT * FROM 元のテーブル名;

この一文だけで、「テーブルの新規作成」と「データの挿入」を同時に実行できるのが大きな特徴です。

動作確認用のサンプルテーブルを作成する

まずは検証用のテーブルを作成しましょう。以下のクエリを実行します。

mysql> create table selectIntoEquivalentDemo
    -> (
    -> ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> ClientName varchar(20),
    -> ClientAge int
    -> );
Query OK, 0 rows affected (0.71 sec)

サンプルデータを挿入する

続いて、INSERTコマンドを使ってレコードを追加します。

mysql> insert into selectIntoEquivalentDemo(ClientName,ClientAge) values('Larry',34);
Query OK, 1 row affected (0.13 sec)
mysql> insert into selectIntoEquivalentDemo(ClientName,ClientAge) values('Maxwell',44);
Query OK, 1 row affected (0.06 sec)
mysql> insert into selectIntoEquivalentDemo(ClientName,ClientAge) values('Bob',38);
Query OK, 1 row affected (0.07 sec)
mysql> insert into selectIntoEquivalentDemo(ClientName,ClientAge) values('David',39);
Query OK, 1 row affected (0.09 sec)

登録されたデータを確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from selectIntoEquivalentDemo

実行結果は以下の通りです。

+----------+------------+-----------+
| ClientId | ClientName | ClientAge |
+----------+------------+-----------+
| 1        | Larry      | 34        |
| 2        | Maxwell    | 44        |
| 3        | Bob        | 38        |
| 4        | David      | 39        |
+----------+------------+-----------+
4 rows in set (0.00 sec)

実際にCREATE TABLE AS SELECT文を実行してみる

それでは、SELECT INTOの代替となるCREATE TABLE AS SELECT文を実行して、新しいテーブル「Client_information」を作成します。

mysql> create table Client_information AS select *from selectIntoEquivalentDemo;
Query OK, 4 rows affected (0.57 sec)
Records: 4 Duplicates: 0 Warnings: 0

「Records: 4」と表示されているように、元テーブルの4件すべてのレコードが正常にコピーされました。

新しいテーブルの中身を確認する

作成されたテーブルのデータをSELECT文で確認します。

mysql> select *from Client_information;

実行結果は以下の通りです。

+----------+------------+-----------+
| ClientId | ClientName | ClientAge |
+----------+------------+-----------+
| 1        | Larry      | 34        |
| 2        | Maxwell    | 44        |
| 3        | Bob        | 38        |
| 4        | David      | 39        |
+----------+------------+-----------+
4 rows in set (0.00 sec)

元のテーブルとまったく同じデータが、新しいテーブルに複製されていることが確認できました。

注意点:インデックスや制約は引き継がれない

CREATE TABLE AS SELECT文は便利な一方で、いくつか注意すべきポイントがあります。

  • 主キーやインデックスはコピーされません。元テーブルでPRIMARY KEYやAUTO_INCREMENTを設定していても、新しいテーブルには引き継がれません。
  • 必要に応じて制約を再定義する必要があります。ALTER TABLE文を使って、後から主キーやインデックスを追加しましょう。

この点を理解しておけば、バックアップ用テーブルの作成やデータの検証作業など、さまざまな場面でCREATE TABLE AS SELECT文を安全に活用できます。

  1. MySQLのSMALLINTに相当するJavaの型は?short型との対応関係を解説

    MySQLのSMALLINTに相当するJavaのデータ型は、short型です。Javaのshort型は2バイト(16ビット)の符号付き整数で、-32768から32767までの範囲の値を扱うことができます。MySQLのSMALLINTも同様に2バイトで、同じ範囲の値を格納可能です。MySQLのSMALLINTとJavaのshort型の比較項目MySQL(SMALLINT)Java(short)サイズ2バイト(16ビット)2バイト(16ビット)値の範囲-32768 ~ 32767-32768 ~ 32767備考UNSIGNEDを指定すると0 ~ 65535になる符号付きのみなお、MySQLでUNS

  2. MySQLでデータベース内のテーブル数を表示するクエリの書き方

    INFORMATION_SCHEMA.TABLESを使ってテーブル数を取得するここでは例として、「WEB」というデータベースを使用しているものとします。このデータベース内に存在するテーブルの総数を調べたい場合、MySQLではINFORMATION_SCHEMA.TABLESを利用するのが便利です。INFORMATION_SCHEMAは、MySQLサーバーが管理しているメタデータ(データベース名、テーブル名、カラム情報など)を格納する仮想データベースであり、これを参照することでスキーマに関する情報をSQLで簡単に取得できます。テーブル数を表示するクエリ「WEB」データベース内のテーブル数を表示す