web-dev-qa-db-ja.com

SQL SELECT INSERTINTO一意のIDを生成

データのテーブルを選択し、このデータを同様の列名を持つ別のファイルに挿入しようとしています(基本的に重複データです)。現在の構文は次のとおりです。

INSERT INTO TABLE1 (id, id2, col1, col2)
SELECT similiarId, similiarId2, similiarCol1, similiarCol2  
FROM TABLE2

私が抱えている問題は、新しく挿入されたレコードに対して一意のキーフィールド(整数として宣言されている)を生成することです。 table1には既存のデータがあり、重複するキー値でエラーが発生するため、table2のキーを使用できません。

テーブルスキーマを変更できません。これらは、DBによって自動的に生成されないカスタムID列です。

9
user1464435

Table1のidフィールドには自動インクリメントがありますか?もしそうなら、インサートからsimiliarIdを失い、自動インクリメントで一意のキーを処理することができますか?

INSERT INTO TABLE1 (id2, col1, col2) SELECT similiarId2, similiarCol1, similiarCol2
FROM TABLE2
8
alex stacey

要件に応じて、次のようにクエリを実行する必要があります。

_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() 関数も追加しました。

より良い説明のために このSQLFiddleを参照してください。

6
hims056

私があなたを正しく理解しているかどうかはわかりません: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がすでに存在していたよりも大きくなるため、主キー違反が原因で挿入が失敗することはありません。

5
Jarek Bielicki

Idフィールドがauto-idとして定義されていて、それを挿入ステートメントから除外すると、sqlは使用可能なプールから一意のIDを生成します。

3
colonelclick

同一のテーブルを作成したい場合は、単純に(すばやくダーティな)INTOメソッドを選択してみませんか?

SELECT * INTO TABLE2
FROM TABLE1 

お役に立てれば。

2
JsChoice

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 )なので、試してみることができると思います。

2
Fabio

カスタムIDでない場合は、table1 IDIDENTITYを作成します。

または

Table1に新しい主キーを作成してIDENTITYにすると、以前のIDを同じ形式で保持できます(主キーは保持できません)。

1
yoozz

最善の策は、Table1.IdのTable2に列を追加することです。このようにして、両方のキーのセットを保持します。

(データのマージで忙しい場合は、Table1.Idを参照している可能性のある外部キーにとってTable1.Idを保持することが重要になる可能性があります。次に、Table1.Idを参照するテーブルの外部キーを「修正」する必要があります。表2)の該当するキーを参照します。

1
StuartLC

範囲が広く、簡単にすばやく作成したいがIDを気にしない場合:

CONCATを使用した例

INSERT INTO session(SELECT CONCAT("3000", id) as id, cookieid FROM `session2`)

ただし、REPLACEも使用できます

0

2番目のテーブルで1番目のテーブルと同様の値を保持する必要がある場合は、2番目のテーブルにauto incrementを適用しないでください。

0
JDGuide