20

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句を組み合わせることができますか?)

4

4 に答える 4

24
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;
于 2011-01-16T18:07:29.387 に答える
3

一意の値のリストを保持する最も簡単な方法は、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)
于 2011-01-16T18:10:23.337 に答える
0

どの例も私にはうまくいきませんでした...だから私はこの例を提案します:

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')
于 2018-11-01T13:32:44.647 に答える
-1

mysqlには挿入無視クエリがあります:

IGNOREキーワードを使用すると、INSERTステートメントの実行中に発生したエラーは代わりに警告として扱われます。たとえば、IGNOREがない場合、テーブル内の既存のUNIQUEインデックスまたはPRIMARY KEY値を複製する行は、重複キーエラーを引き起こし、ステートメントは中止されます。IGNOREを使用しても、行は挿入されませんが、エラーは発行されません。IGNOREが指定されていない場合、エラーをトリガーするデータ変換はステートメントを中止します。IGNOREを使用すると、無効な値が最も近い値に調整されて挿入されます。警告が生成されますが、ステートメントは中止されません。mysql_info()C API関数を使用して、テーブルに実際に挿入された行数を判別できます。

http://dev.mysql.com/doc/refman/5.0/en/insert.html

ON DUPLICATEKEYUPDATEもご利用いただけます

于 2011-01-16T18:59:39.470 に答える