web-dev-qa-db-ja.com

存在しない場所で挿入するにはどうすればよいですか?

PK制約に違反しないように、挿入クエリを「存在しない場所」と組み合わせたいのですが。ただし、次のような構文ではIncorrect syntax near the keyword 'WHERE'エラー-

INSERT INTO myTable(columns...)
VALUES(values...)
WHERE NOT EXISTS
   (SELECT *
    FROM myTable
    WHERE pk_part1 = value1,
        AND pk_part2 = value2)

どうすればこれを達成できますか?

(一般的に、挿入とwhere句を組み合わせることができますか?)

19
froadie
INSERT INTO myTable(columns...)
Select values...
WHERE NOT EXISTS
   (SELECT *
    FROM myTable
    WHERE pk_part1 = value1,
        AND pk_part2 = value2)

編集:マーティンのリンクを読んだ後、認めれば、最善の解決策は次のとおりです。

BEGIN TRY
    INSERT INTO myTable(columns...)
    values( values...)
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH;
23
bernd_k

値の一意のリストを保持する最も簡単な方法は、a)列を主キーとして設定するか、b)列に一意の制約を作成することです。これらのどちらでも、テーブルに既に存在する値に値を挿入/更新しようとするとエラーが発生し、NOT EXISTS/etcなどがサイレントに失敗するとエラーは発生しません。クエリは適切に実行されます。

つまり、INSERT/SELECTを使用します(VALUES部分は含めないでください)。

INSERT INTO myTable(columns...)
SELECT [statically defined values...]
  FROM ANY_TABLE
 WHERE NOT EXISTS (SELECT NULL
                     FROM myTable
                    WHERE pk_part1 = value1
                      AND pk_part2 = value2)
3
OMG Ponies

どの例も私にとってはうまくいかなかったので...この例をお勧めします:

INSERT INTO database_name.table_name(column_name)
SELECT column_name
  FROM database_name.table_name
 WHERE NOT EXISTS (SELECT NULL
                     FROM database_name.table_name
                    WHERE column_name = 'Column Value')
0
Tom Stock