10

レコードがない場合にレコードを挿入するソリューションが欲しかったので、ここで検索して解決策を見つけましたが、別の問題があります

INSERT INTO closed_answers (question_id, subject_id)
SELECT * FROM (SELECT 2, 2) AS tmp
WHERE NOT EXISTS (
    SELECT question_id FROM closed_answers WHERE question_id = 2 AND subject_id = 2
) LIMIT 1

出力は

#1060 - Duplicate column name '2'

同一でない2つの数字を使用した場合は機能しますが、2つの数字が同じである場合に問題が発生します

4

2 に答える 2

18

SQL を機能させるための最小の変更は、select ステートメントにエイリアスを追加することです。

INSERT INTO closed_answers (question_id, subject_id)
SELECT * FROM (SELECT 2 AS question_id, 2 AS subject_id) AS tmp
WHERE NOT EXISTS (
    SELECT question_id
    FROM closed_answers
    WHERE question_id = 2 AND subject_id = 2
) LIMIT 1

ただし、一意の制約がある場合は、代わりに(question_id, subject_id)使用できます。INSERT IGNORE

INSERT IGNORE INTO closed_answers (question_id, subject_id)
VALUES (2, 2)
于 2010-07-27T17:48:38.343 に答える
4
INSERT INTO closed_answers (question_id, subject_id) 
SELECT * FROM (SELECT 2 a, 2 b) AS tmp 
WHERE NOT EXISTS ( 
    SELECT 1 FROM closed_answers WHERE question_id = 2 AND subject_id = 2 
) LIMIT 1 

サブクエリを使用したselectステートメントは奇妙で不必要ですが、選択されている列に名前を付けていないことが問題でした。exists を使用する場合は、フィールドではなく 1 を選択するだけで十分です。また、制限1は必要ありませんでした。

于 2010-07-27T17:51:08.303 に答える