データのテーブルを選択し、このデータを同様の列名を持つ別のファイルに挿入しようとしています(基本的に重複データです)。現在の構文は次のとおりです。
INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT similiarId, similiarId2, similiarCol1, similiarCol2
FROM TABLE2
私が抱えている問題は、新しく挿入されたレコードに対して一意のキーフィールド(整数として宣言されている)を生成することです。 table1には既存のデータがあり、重複するキー値でエラーが発生するため、table2のキーを使用できません。
テーブルスキーマを変更できません。これらは、DBによって自動的に生成されないカスタムID列です。
Table1のidフィールドには自動インクリメントがありますか?もしそうなら、インサートからsimiliarIdを失い、自動インクリメントで一意のキーを処理することができますか?
INSERT INTO TABLE1 (id2, col1, col2) SELECT similiarId2, similiarCol1, similiarCol2
FROM TABLE2
要件に応じて、次のようにクエリを実行する必要があります。
_INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT (ROW_NUMBER( ) OVER ( ORDER BY ID ASC ))
+ (SELECT MAX(id) FROM TABLE1) AS similiarId
, similiarId2, similiarCol1, similiarCol2
FROM TABLE2
_
私はここで何をしましたか:
1から始まる ROW_NUMBER()
を追加したので、宛先テーブルのIDの MAX()
関数も追加しました。
私があなたを正しく理解しているかどうかはわかりません:TABLE2からすべてのデータをコピーしたいのですが、TABLE2.similiarIdがTABLE1.idにすでに含まれていないことを確認してください。おそらく、これが問題の解決策です。
DECLARE @idmax INT
SELECT @idmax = MAX(id) FROM TABLE1
INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT similiarId + @idmax, similiarId2, similiarCol1, similiarCol2
FROM TABLE2
挿入されたすべてのIDは、ID witchがすでに存在していたよりも大きくなるため、主キー違反が原因で挿入が失敗することはありません。
Idフィールドがauto-idとして定義されていて、それを挿入ステートメントから除外すると、sqlは使用可能なプールから一意のIDを生成します。
同一のテーブルを作成したい場合は、単純に(すばやくダーティな)INTOメソッドを選択してみませんか?
SELECT * INTO TABLE2
FROM TABLE1
お役に立てれば。
SQL Serverには、関数ROW_NUMBERがあります。正しく理解していれば、次のコードで必要な処理を実行できます。
INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT (ROW_NUMBER( ) OVER ( ORDER BY similiarId2 ASC )) + 6 AS similiarId,
similiarId2, similiarCol1, similiarCol2
FROM TABLE2
ROW_NUMBERは各行の番号を取得し、それに「魔法の値」を追加して、それらの値をTABLE1の現在の最大IDとは異なるものにすることができます。現在の最大IDが6であるとすると、ROW_NUMBERの各結果に6を加算すると、7、8、9などになります。この方法では、TABLE1の主キーに同じ値を設定することはできません。
Googleに問い合わせたところ、Sybaseにも関数ROW_NUMBERがあるとのことでした( http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.sqlanywhere.12.0。 1/dbusage/ug-olap-s-51258147.html )なので、試してみることができると思います。
カスタムIDでない場合は、table1 IDIDENTITYを作成します。
または
Table1に新しい主キーを作成してIDENTITYにすると、以前のIDを同じ形式で保持できます(主キーは保持できません)。
最善の策は、Table1.IdのTable2に列を追加することです。このようにして、両方のキーのセットを保持します。
(データのマージで忙しい場合は、Table1.Idを参照している可能性のある外部キーにとってTable1.Idを保持することが重要になる可能性があります。次に、Table1.Idを参照するテーブルの外部キーを「修正」する必要があります。表2)の該当するキーを参照します。
範囲が広く、簡単にすばやく作成したいがIDを気にしない場合:
CONCATを使用した例
INSERT INTO session(SELECT CONCAT("3000", id) as id, cookieid FROM `session2`)
ただし、REPLACEも使用できます
2番目のテーブルで1番目のテーブルと同様の値を保持する必要がある場合は、2番目のテーブルにauto increment
を適用しないでください。