-1

数据库:

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

第一次执行它会给 John,1

第二次执行它预计会给 John,2

但是它使用新键 John,1 John,2 放置相同的值

如何以正确的方式进行?

4

3 回答 3

1

您的name字段不是主键或标记为唯一的,因此允许重复。更改您的表格以将“名称”标记为这样的唯一

ALTER  TABLE `list_advertLeaders` ADD UNIQUE INDEX `name_UNIQUE` (`name` ASC);
于 2013-10-14T19:34:58.897 回答
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';

First 将仅在没有记录时插入,否则它什么也不做。我在名称上有索引并且这种构造速度很快时会这样做(如果您关心 - 需要与其他包括基准中的关键触发器进行比较,这取决于 mysql 版本)。

于 2013-10-14T19:34:14.723 回答
0

正如所建议的那样,它只有在语句违反 a or约束ON DUPLICATE KEY UPDATE时才会起作用。INSERTPRIMARY KEYUNIQUE

由于name不应该有重复项,并且如果您没有其他特定用途key,您可以定义name为表的主键:

CREATE TABLE IF NOT EXISTS `list_advertLeaders` (
  `name` varchar(18) NOT NULL PRIMARY KEY,
  `points` int(9) NOT NULL
)
于 2013-10-14T19:02:04.710 回答