INSERT如果不存在

时间:2015-02-01 11:29:40

标签: mysql sql

看起来非常简单,但我已经尝试了我能在这里找到的所有内容并且一直收到错误#1064 - 您的SQL语法出错;

每次用户访问该页面时,我都想更新名为range_views的表

INSERT INTO range_views (range_id, ip_address, view_date) values('112','123.123.123.123','2015-02-01')
WHERE NOT EXISTS ( SELECT * FROM range_views 
               WHERE range_id = '112'
               AND ip_address = '123.123.123.123'
               AND view_date = '2015-02-01');

该表有4列

id - AUTO_INCREMENT
range_id - INT(6)
ip_address - VARCHAR(15)
view_date - VARCHAR(10)

2 个答案:

答案 0 :(得分:4)

此语法无效。您必须使用语法INSERT INTO ... SELECT重写它,如下所示:

INSERT INTO range_views (range_id, ip_address, view_date) 
SELECT '112', '123.123.123.123', '2015-02-01'
FROM range_views
WHERE NOT EXISTS(SELECT * FROM range_views 
                 WHERE range_id = '112'
                   AND ip_address = '123.123.123.123'
                   AND view_date = '2015-02-01');

答案 1 :(得分:1)

在列UNIQUE INDEXrange_idip_address上创建view_date

ALTER TABLE range_views
ADD UNIQUE INDEX id_ip_date(range_id, ip_address, view_date);

无论如何你需要这个索引;只有在表中尚不存在(range_idip_addressview_date)对的值时,它才会强制执行添加新条目的规则。

然后INSERT值并添加IGNORE

INSERT IGNORE INTO range_views(range_id, ip_address, view_date) 
VALUES('112','123.123.123.123','2015-02-01');

documentation说:

  

如果使用IGNORE关键字,则会忽略执行INSERT语句时发生的错误。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将中止。使用IGNORE,该行将被丢弃,并且不会发生错误。忽略的错误会生成警告。