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