4

old_table と new_table があります。

CREATE TABLE `old_table` (
        `id` bigint(20) NOT NULL AUTO_INCREMENT,
        `col1` varchar(15) DEFAULT NULL,
        `col2` int(15) デフォルト NULL,
        ...、
        PREMARY_KEY (`id`)
);

CREATE TABLE `new_table` LIKE `old_table`;

次に、両方のテーブルにいくつかの値が入力されます。その後、old_table からいくつかの行を選択し、new_table に挿入します。

INSERT INTO `old_table` SELECT * FROM `new_table` WHERE col2 > 100;

ただし、これにより、重複キーによるエラーが発生します。実際のシステムではテーブルに多数の列があるため、SELECT 句で列を指定するのが面倒です。

問題を回避するための最良の方法は何ですか?

4

3 に答える 3

3
set @sql =  (select concat('insert into new_table SELECT NULL,',
             group_concat(column_name),' from ','old_table') from information_schema.columns
         where table_name = 'old_table' and table_schema = '<database>' and column_name != 'id'
             order by ordinal_position);

prepare stmt1 from @sql;
execute stmt1;
deallocate prepare stmt1;

どこ

<database> - your database

MySQL の 1 つを除くすべての列を選択しますか?

mySqlのEXECUTEステートメントからデータを挿入するには?

于 2012-07-19T17:00:20.363 に答える
2

おそらく、値の存在をテストし、idそれを正しい新しい値に置き換える挿入前トリガーを作成できます(または、それが機能する場合は無効にします-MySQLがbarfするか、次の自動インクリメントを与えるかはわかりません値) が重複している場合。

個人的には、この種のトリガーを持続させたくないと思いますが、1 回限りの挿入を行うだけであれば、トリガーを作成し、挿入を実行してから、トリガーをすぐにドロップできます。

于 2012-07-19T16:38:07.237 に答える
-1

私は同じ問題に遭遇し、次のように解決しました: - new_table の id 列を変更します (自動インクリメントと主キーを削除し、NULL を許可します) - new_table のすべての ID を NULL に設定します - これで実行できます

INSERT INTO 'old_table' SELECT * FROM new_table

于 2014-03-28T10:42:48.920 に答える