数据库:
CREATE TABLE IF NOT EXISTS `list_advertLeaders` (
`key` int(12) NOT NULL AUTO_INCREMENT,
`name` varchar(18) NOT NULL,
`points` int(9) NOT NULL,
PRIMARY KEY (`key`)
)
所以我想UPDATE
行或者如果不存在则创建它:
INSERT INTO list_advertLeaders (name, points) VALUES ('John', '1') ON DUPLICATE KEY UPDATE points=points+1
第一次执行它给出 约翰,1
预计第二次执行它 约翰,2
但它使用新密钥放置相同的值 约翰,1 约翰,2
如何正确使用?
答案 0 :(得分:1)
您的name
字段不是主键或标记为唯一,因此允许重复。改变你的表格,将'name'标记为像这样的唯一
ALTER TABLE `list_advertLeaders` ADD UNIQUE INDEX `name_UNIQUE` (`name` ASC);
答案 1 :(得分:0)
正如ON DUPLICATE KEY UPDATE
所示,只有在INSERT
声明违反PRIMARY KEY
或UNIQUE
约束条件时才会有效。
由于name
不应该有重复项,并且key
没有其他特定用途,您可以将name
定义为表的主键:
CREATE TABLE IF NOT EXISTS `list_advertLeaders` (
`name` varchar(18) NOT NULL PRIMARY KEY,
`points` int(9) NOT NULL
)
答案 2 :(得分:0)
我曾经做过的这样的任务:
INSERT INTO list_advertLeaders (name, points) select 'John', '0' from
( select 1 as a ) a
where (select 1 from list_advertLeaders b where b.name='John') is null;
UPDATE list_advertLeaders set points=points+1 where name='John';
首先只在没有记录的情况下插入,否则它什么都不做。当我在名称上有索引并且这种构造很快时(如果你关心 - 需要与其他包括基准中的键上的触发器进行比较,这取决于mysql版本)我会这样做。