MySQL INSERT或UPDATE(如果存在)

时间:2013-10-14 18:57:50

标签: mysql

数据库:

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

如何正确使用?

3 个答案:

答案 0 :(得分:1)

您的name字段不是主键或标记为唯一,因此允许重复。改变你的表格,将'name'标记为像这样的唯一

ALTER  TABLE `list_advertLeaders` ADD UNIQUE INDEX `name_UNIQUE` (`name` ASC);

答案 1 :(得分:0)

正如ON DUPLICATE KEY UPDATE所示,只有在INSERT声明违反PRIMARY KEYUNIQUE约束条件时才会有效。

由于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版本)我会这样做。