mysqlでテーブルをコピーする最速の方法は?


82

MySQLでテーブルをコピーしたい。最速の方法は何ですか?このような?

CREATE TABLE copy LIKE original;
INSERT INTO copy SELECT * FROM original;

または

CREATE TABLE copy SELECT * FROM original;
ALTER TABLE copy ADD PRIMARY KEY (id);

または別の方法はありますか?

編集:インデックスが再作成されるのが心配ですが、mysqlはこれらのステートメントの実行をどのように進めますか?

PS。mysqldumpのようなコマンドラインツールは使用できません。オンザフライである必要があります。

回答:


50

これにより、テーブルの構造がすぐにコピーされますが、データはコピーされません。

CREATE TABLE copy LIKE original;

これにより、originalテーブルが持っていたすべてのインデックスが作成されます。

mysqlではこのように機能し5.1.39ます。


3
ただし、トリガーはコピーされません。
ursitesion 2014

3
これは外部キー制約もコピーしないことに注意してください。
Omer Sabic 2017

47

インデックス保持しながらMyISAMテーブルを使用する最速の方法)およびおそらく他のストレージエンジンは次のとおりです。

CREATE TABLE copy LIKE original;
ALTER TABLE copy DISABLE KEYS;
INSERT INTO copy SELECT * FROM original;
ALTER TABLE copy ENABLE KEYS;

データベースをロードするためにキーを無効にして、最後にキーを再作成する必要があります。

同様に、InnoDBの場合

SET unique_checks=0; SET foreign_key_checks=0; 
..insert sql code here..
SET unique_checks=1; SET foreign_key_checks=1;

(コメントで指摘されているように。)


1
奇妙な。キーを使用したINSERTには36分かかり、このメソッドには10 + 26分かかりました(挿入+変更)。6つのインデックス、28 Mのレコード、Win 7 x64、8GBのRAM。
リンドバーグによる

ENABLE KEYSは、「修復テーブル」を引き起こします。これが発生する方法でプロセスリストを確認してください。次の2種類があります。1。キーキャッシュを使用してテーブルを修復します。2。並べ替えてテーブルを修復します。2番目のテーブルは、高速の場合に使用され、myisam_max_sort_file_sizeが十分に大きい場合にのみ使用されます。 dev.mysql.com/doc/refman/5.7/en/repair-table-speed.html
lopo

ALTER TABLE table DISABLE/ENABLE KEYSInnoDBでは機能せず、以下の警告が表示されTable storage engine for 'table' doesn't have this optionます。
Amil Waduwawara 2016

1
innodbの場合は、SET unique_checks=0; SET foreign_key_checks=0;ここにSQLコードを挿入しますSET unique_checks=1; SET foreign_key_checks=1;
tuku 2017年

13

マニュアルから:

"CREATE TABLE ... SELECTは自動的にインデックスを作成しません。これは、ステートメントを可能な限り柔軟にするために意図的に行われます。作成されたテーブルにインデックスを含める場合は、SELECTステートメントの前にこれらを指定する必要があります。"

CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;

との両方CREATE TABLE LIKEを使用して、インデックスとデータ型を(データ型変換を回避するために)指定できますCREATE TABLE SELECT。どちらが速いかは、セットアップによって異なります。


9

インデックスとトリガーを使用してコピーするには、次の2つのクエリを実行します。

CREATE TABLE newtable LIKE oldtable; 
INSERT newtable SELECT * FROM oldtable;

構造とデータだけをコピーするには、次のものを使用します。

CREATE TABLE tbl_new AS SELECT * FROM tbl_old;

INSERT INTO代わりにすべきではありませんINSERTか?
ジョルダーノ

6

DOESのcreate table mynewtable (select * from myoldtable)MySQLで動作しますか?もしそうなら、あなたもそれを試すことができます。


5

(新しいテーブルを作成することにより)あるテーブルから別のテーブルに構造とすべてのエントリをコピーする最良の方法は、このクエリです...

CREATE TABLE new_table LIKE old_table; INSERT new_table SELECT * FROM old_table;


3

を試してSELECT INTO変数を仲介として使用してください。

最初に、ソーステーブルと同じ構造を持つように受信テーブルを作成する必要があります。

一番いいのは、内部にあるので高速です。ただし、インデックスは失われます。


Select intoはmySQLではサポートされていません
Draco Ater 2010年

@Draco Ater-はい、そうです。変数を使用するだけです。
amphetamachine 2010年

2
例を挙げていただけますか?原因私は、変数はselectによって読み取られた最後の値を保持するだけで、テーブル内のすべての値を保持するわけではないと思います。カーソルを使用せず、複数の行を持つテーブルをコピーしたくない限り、このソリューションはまったく機能しません。
fancyPants 2013

2

MyISAMを使用している場合は、個々のファイルをコピーして名前を変更することもできます。バックエンドの.MYD、.MYI、.FRMファイル


1

多分あなたは見てみることができますSHOW CREATE TABLE

実行する手順:

  • phpmyadminに移動します

  • SQLに移動

このクエリを実行します

SHOW CREATE TABLE `the_old_table`;
  • オプションをクリック「全文」にチェックを入れ、「実行」を押します。

結果は完全なCREATETABLEステートメントです。満足するまでクエリを編集します。

リソース:http//dev.mysql.com/doc/refman/5.7/en/show-create-table.html


0
CREATE TABLE copy SELECT * FROM original;

これは速い方法ですが、インデックスの最も速い原因ではないかもしれません。


回答を編集して適切にフォーマットし、読みやすくしてください。
neeku 2014年

1
このステートメントは、このテーブルに関連付けられたインデックスもトリガーもコピーしません。
ursitesion 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.