MySQL条件插入。适用于phpMyAdmin但不适用于PHP脚本

时间:2010-12-19 03:19:51

标签: mysql sql insert mysql-error-1062

我正在尝试从PHP脚本创建一个条件INSERT到我的MySQL数据库中。以下SQL语法适用于phpMyAdmin,但不适用于我的PHP脚本:

INSERT INTO profiles (id, firstname)
SELECT "22","John" from profiles
WHERE NOT EXISTS (
SELECT * FROM li_profiles
WHERE li_p_firstname = "John"
)

(注意“id”是主键,“firstname”不是键或唯一的)

可能是问题的一部分的奇怪之处在于,当我在phpMyAdmin中运行该SQL时,它确实“工作”(意味着添加了一个新的记录,ID为“22”,名字为“John”)我得到以下警告:“#1062 - 密钥1重复输入'22'” 但该表没有先前的id为22的条目。?? !!

发生了什么事?

3 个答案:

答案 0 :(得分:0)

您将获得iD的重复条目,因为您要为profiles表中的每一行插入一个新行;对于profiles表中的每一行,li_profiles表中没有John。你可以试试

INSERT INTO profiles (id, firstname)
    SELECT "22","John" from profiles
        WHERE NOT EXISTS (SELECT * FROM li_profiles
                              WHERE li_p_firstname = "John")
        LIMIT 1;

这将消除重复的问题(如果它有效,抱歉,但我自己没有检查过。)

答案 1 :(得分:0)

我以不同的方式想出来了。 (我被告知HAVING声明很慢,所以我不确定这是最好的方法......但这是我唯一可行的方法。)

INSERT INTO profiles (id,firstname)
SELECT 22,'John'
FROM li_profiles
WHERE firstname = 'John'
HAVING COUNT(*) = 0;

答案 2 :(得分:-1)

将SELECT更改为VALUES

INSERT INTO profiles (id, firstname) VALUES("22","John") FROM profiles WHERE NOT EXISTS ( SELECT * FROM li_profiles WHERE li_p_firstname = "John" )

此外,如果您使用自动增量值,则应指定下一个值。另外,如果是整数,则给出整数(22)而不是字符串(“22”)