MySQL:行をコピーする方法、ただしいくつかのフィールドを変更する方法


195

コピーする行が多数ありますが、1つのフィールドを変更する必要があります。

コピーする行を選択できます。

select * from Table where Event_ID = "120"

次に、これらの行をすべてコピーし、Event_IDをに設定して新しい行を作成し155ます。どうすればこれを達成できますか?

回答:


278
INSERT INTO Table
          ( Event_ID
          , col2
           ...
          )
     SELECT "155"
          , col2
           ...
      FROM Table WHERE Event_ID = "120"

ここで、col2、...は、テーブルの残りの列(Event_ID 以外の列)を表します。


39
列名を指定せずにそれを行う方法はありますか?
Andrew

4
私が知っていることではありません。もちろん、テーブルに1000列程度のものがあり、それらすべてを入力したくない場合は、SQLステートメントを記述してSQLステートメントを作成できます。これを行う方法は、information_schemaを使用してテーブルの列名を取得することです。しかし、それは本当にやりすぎです。列名を入力するだけです。
dcp、

3
アスタリスクを使用して残りの列を取得することは可能ですか?
Peter

2
ログインして賛成投票を行ったところ、すでに賛成投票が行われていることがわかりました。これで数回助かったと思います:)ありがとう!
aexl 2017年

2
@Bitterblue-申し訳ありませんが、コメントを理解できません。col2と言ったことはありません...コピーしたくない列でした。テーブルの残りの列を表すとだけ言ったのです。それらがコピーされることは明らかです。それ以外の場合は、SQLステートメントに含まれません。
dcp

140

これは、テーブルに多くのフィールドがあり、すべてのフィールドを入力する手間をかけたくない場合に必要なフィールドを入力するだけのソリューションです:)

一部の行を同じテーブルにコピーし、一部のフィールドに異なる値を設定する方法:

  1. コピーするすべての行を含む一時テーブルを作成します
  2. 一時テーブルのすべての行を必要な値で更新します
  3. 自動インクリメントフィールドがある場合は、一時テーブルでNULLに設定する必要があります
  4. 一時テーブルのすべての行を元のテーブルにコピーします
  5. 一時テーブルを削除する

あなたのコード:

CREATE table temporary_table AS SELECT * FROM original_table WHERE Event_ID="155";

UPDATE temporary_table SET Event_ID="120";

UPDATE temporary_table SET ID=NULL

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

一般的なシナリオコード:

CREATE table temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

UPDATE temporary_table SET <auto_inc_field>=NULL;

INSERT INTO original_table SELECT * FROM temporary_table;

DROP TABLE temporary_table

簡略化/圧縮されたコード:

CREATE TEMPORARY TABLE temporary_table AS SELECT * FROM original_table WHERE <conditions>;

UPDATE temporary_table SET <auto_inc_field>=NULL, <fieldx>=<valuex>, <fieldy>=<valuey>, ...;

INSERT INTO original_table SELECT * FROM temporary_table;

一時テーブルの作成はTEMPORARYキーワードを使用するため、セッションが終了すると(@ ar34zが示唆するように)自動的に削除されます。


7
MySQLは、TEMPORARY一時テーブルを作成するためのキーワードをサポートしています。CREATE TEMPORARY TABLEセッション(SQLクエリのシリーズ)が終了すると、の使用によりテーブルが自動的に削除されます。テーブルを削除する必要はなく、同じ名前を使用する他の一時テーブルと競合しません。(例:ライブハッキングの場合(お勧めしません))
ar34z 14

1
このコードは、temporary_tableではなく#temporary_tableを使用している場合にのみ機能します。MSSQLの問題でしょうか。
TruthOf42

16
これは基本的には完璧に機能しましたが、元のテーブルからコピーされたように見える一時テーブルの主キーに対するNot Null制約を克服する必要がありました。更新前に一時テーブルを次のように変更することで、これを修正しました。ALTER TABLE temporary_table MODIFY <auto_inc_not_null_field> INT; そうすると、主キーのNullへの更新が失敗しなくなります。
snorris

1
PostgreSQL 9.4では動作しませんException: null value in column <auto_inc_not_null_field> violates not-null constraint。私が試したALTER TABLE temporary_table ALTER COLUMN <auto_inc_not_null_field> DROP NOT NULL;
n1000

1
MySQLとMariaDBの異なるバージョンでテストしました。私にとっては完璧に機能し、私はこのバージョンを受け入れられた回答よりも好んでいます。これは実際にここでかなり頻繁に発生します:)
hexereiソフトウェア

40

テーブルに他の2つの列があるとしましょう:fooとbar

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, "155"
  FROM Table
 WHERE Event_ID = "120"

4
列名を指定せずにそれを行う方法はありますか?
Andrew

MySQLへ@PeterBailey新しい、あなたはコードが動作する方法についてのいくつかの光を当てるしてください可能性:/
3kstc

10

テーブルに多数の列があり、それぞれを入力したくない場合は、次のように一時テーブルを使用して列を入力できます。

SELECT *
INTO #Temp
FROM Table WHERE Event_ID = "120"
GO

UPDATE #TEMP
SET Column = "Changed"
GO

INSERT INTO Table
SELECT *
FROM #Temp

6
注:これは、テーブルに主キーがないことを前提としています
kommradHomer '25 / 07/25

2

すべてのフィールドをコピーして、そのうちの1つを同じ値+別の値に変更してみてください。

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, Event_ID+"155"
  FROM Table
 WHERE Event_ID = "120"

??????????


0

Event_IDがIntegerである限り、次のようにします。

INSERT INTO Table (foo, bar, Event_ID)
SELECT foo, bar, (Event_ID + 155)
  FROM Table
WHERE Event_ID = "120"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.