【问题标题】:MySQL Conditional Insert. Works in phpMyAdmin but not PHP ScriptMySQL 条件插入。适用于 phpMyAdmin 但不适用于 PHP 脚本
【发布时间】:2011-05-27 18:08:36
【问题描述】:

我正在尝试通过 PHP 脚本在我的 MySQL 数据库中创建条件 INSERT。以下 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。??!!

发生了什么事?

【问题讨论】:

    标签: mysql sql insert mysql-error-1062


    【解决方案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")

    【讨论】:

    • 谢谢,赛斯。不幸的是,它仍然不起作用。进行该切换会在 phpMyAdmin 中出现此错误:1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 5 行的 'FROM profiles WHERE NOT EXISTS ( SELECT * FROM li_profiles WHERE li_p_firstname '附近使用正确的语法。第 5 行是“来自配置文件”。因为我拿出了选择,我认为 FROM 不属于了。如果我取出“FROM 个人资料”,它也不起作用。还有其他想法吗?
    • 赛斯,我想出了一种不同的方法。不过,感谢您在引号中找到我的整数。为我省去了一些未来的头痛。
    • 对不起,你的回答是错误的。 insert into table select a, b from table 是有效的 MySQL 语法,有时非常有用。
    【解决方案2】:

    您将获得 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;
    

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

    【讨论】:

      【解决方案3】:

      我以不同的方式解决了这个问题。 (有人告诉我 HAVING 语句很慢,所以我不确定它是不是最好的方法......但它是我工作的唯一方法。)

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

      【讨论】:

      • 这个查询没有做那么多:它只是将“22”、“John”插入到表中,如果它不存在的话。如果这是您想要的,请尝试INSERT IGNORE (id, firstname) VALUES (22, "John") - 这样您就不会编写不需要的 SELECT。
      • 对不起,科纳拉克。我在答案中写错了代码。如果 DIFFERENT 表中不存在某些值,我想在某个表中插入一条记录。我刚刚编辑了我的答案以反映这一点。鉴于此,有没有比使用“Having”更有效的方法?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多