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 回答