SQL Server、データベースを使っていて、ある列の値だけを変えて、残りの列はそのままでレコードをコピーしたいことがありますね。
どうやればよいでしょうか?
プライマリキーをコピーするとキー制約違反
プライマリキーをコピーするとキー制約違反が発生します。
1 |
insert into MyTable select * from MyTable where uniqueId = @Id; |
そこでコピーしたいフィールドを列挙します。
1 |
insert into MyTable(field1, field2, id_backup) select field1, field2, uniqueId from MyTable where uniqueId = @Id; |
指定されていないフィールドは、デフォルト値を受け取ります。
定義されていない場合は通常NULLです。
・https://codeday.me/jp/qa/20181205/34297.html
主キーのみを変更し、残りのデータはすべて同じものをコピー
次の例は、同じテーブル内で、主キーを変更し、残りのデータは丸々同じものを追加したいという例です。
コードを主キーとした住所録というマスタがあるとします。
(住所録) SQL実行前
コード|名称|住所|・・・×n
-----------------------------
511000 ああ 東京
512000 いい 千葉
513000 うう 埼玉
これを主キーをある形態に基づいて変更したキーで新データとして追加したい(コピー)とします。
(元) (新)
511000 ⇒ 101511
512000 ⇒ 101512
513000 ⇒ 101513
(住所録) SQL実行後
コード|名称|住所|・・・×n
-----------------------------
511000 ああ 東京
512000 いい 千葉
513000 うう 埼玉
101511 ああ 東京
101512 いい 千葉
101513 うう 埼玉
なるべく簡略したSQL文で、これを実装する方法はないでしょうか。
SQL Serverで特定の値を変えてレコードのコピー
項目が1つ変更されますので、全項目を並べる作業からは逃れられません。
1レコードの追加は以下の通りです。
1 |
INSERT INTO 住所録(101511, 名称, 住所, ..., Xn) FROM 住所録 WHERE コード = 511000 |
挿入するデータを作るSELECT文を作り、その頭にINSERT句を追加すると、結果をそのまま挿入することができます。
1 |
INSERT INTO 住所録 SELECT '101' || substr(コード,1,3), 名称, 住所, ... Xn FROM 住所録WHER コード between 500000 and 599000 |
コメント