在插入ERROR之前检查记录是否已存在

时间:2018-02-16 12:37:31

标签: php mysql sql database

$sql = "INSERT INTO `diver` (`firstname`, `lastname`, `registrated`)
        SELECT '$fname', '$lname', now()
        WHERE NOT EXISTS (SELECT firstname, lastname FROM `diver` WHERE diver.firstname = '$fname' AND diver.lastname = '$lname')";

我收到此错误: 您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以便在#&; 39,WHERE NOT EXISTS附近使用正确的语法(SELECT firstname,lastname FROM diver WHERE diver.firstname =' at line 3

代码在localhost中运行得非常好,但是在我的在线数据库中却没有。有没有其他解决方案可以做同样的事情?

1 个答案:

答案 0 :(得分:1)

学习使用参数。在MySQL中,您需要from才能使用where。一种方法是使用from dual(从Oracle采用)。

我倾向于选择:

INSERT INTO `diver` (`firstname`, `lastname`, `registrated`)
    SELECT fname, lname, now()
    FROM (SELECT ? as fname, ? as lname) x
    WHERE NOT EXISTS (SELECT 1
                      FROM `diver` d
                      WHERE d.firstname = x.fname AND
                            d.lastname = x.lname
                     );

我假设您打算not exists,因为插入具有重复值的行通常不是您想要做的。

实际上,这不是最好的方法。而是在名称列上创建唯一的索引/约束:

create unique index unq_diver_firstname_lastname on diver(firstname, lastname);

insert into `diver` (`firstname`, `lastname`, `registrated`)
     values (?, ?, now())
     on duplicate key update firstname = values(firstname);

插入副本时,这不起作用。

另请注意,名称不一定是唯一的,因此检查名称的唯一性通常不是一个好主意。