Mysql - 重复密钥更新不适用于2个密钥

时间:2015-08-27 21:19:36

标签: php mysql duplicate-data

您好我有一个表有两个唯一键profile_id和日期。我不知道问题出在哪里,但我的查询无效。

表:

CREATE TABLE `profile_views` 
    (\n  `id` int(11) NOT NULL AUTO_INCREMENT,
    \n  `profile_id` varchar(45) DEFAULT NULL,
    \n  `counter` varchar(45) DEFAULT NULL,
    \n  `date` date DEFAULT NULL,
    \n  PRIMARY KEY (`id`),
    \n  UNIQUE KEY `date_UNIQUE` (`date`),
    \n  UNIQUE KEY `profile_id_UNIQUE` (`profile_id`)\n
    ) ENGINE=InnoDB AUTO_INCREMENT=150 DEFAULT CHARSET=latin1'

数据现在:

# id , profile_id, counter, date
  113,      2    ,   36   , 2015-08-27

我发出这个命令:

INSERT INTO profile_views (profile_id, counter, date) 
VALUES (2, 1, '2015-08-28') 
ON DUPLICATE KEY UPDATE counter = counter+1;

INSERT INTO profile_views (profile_id, counter, date) 
VALUES (2, 1, '2015-08-27') 
ON DUPLICATE KEY UPDATE counter = counter+1;

在这个查询中,我刚刚更改了日期,因此它应该插入新行。

我想要的结果:

如果我更改日期仍然会更改相同的个人资料ID计数器。 我想为每个个人资料ID存储每日个人资料视图。因此,如果日期和配置文件ID与其增量相同,则计数器将插入新行。

有任何帮助吗?感谢。

2 个答案:

答案 0 :(得分:0)

架构:

CREATE TABLE `profile_views` 
(  
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `profile_id` varchar(45) DEFAULT NULL,
   `counter` varchar(45) DEFAULT NULL,
   `date` date DEFAULT NULL,
   PRIMARY KEY (`id`),
   UNIQUE KEY `date_UNIQUE` (`date`),
   UNIQUE KEY `profile_id_UNIQUE` (`profile_id`)
) ENGINE=InnoDB auto_increment=150;

insert profile_views (id,profile_id,counter,date) values (113,2,36,'2015-08-27');

... ...

select * from profile_views;
+-----+------------+---------+------------+
| id  | profile_id | counter | date       |
+-----+------------+---------+------------+
| 113 | 2          | 36      | 2015-08-27 |
+-----+------------+---------+------------+

INSERT INTO profile_views (profile_id, counter, date) 
VALUES (2, 1, '2015-08-28') 
ON DUPLICATE KEY UPDATE counter = counter+1;
-- 2 row(s) affected
select * from profile_views;
+-----+------------+---------+------------+
| id  | profile_id | counter | date       |
+-----+------------+---------+------------+
| 113 | 2          | 37      | 2015-08-27 |
+-----+------------+---------+------------+

INSERT INTO profile_views (profile_id, counter, date) 
VALUES (2, 1, '2015-08-27') 
ON DUPLICATE KEY UPDATE counter = counter+1;
-- 2 row(s) affected
select * from profile_views;
+-----+------------+---------+------------+
| id  | profile_id | counter | date       |
+-----+------------+---------+------------+
| 113 | 2          | 38      | 2015-08-27 |
+-----+------------+---------+------------+

对我来说很好看。重复更新时的每个插入都有唯一的密钥冲突,允许更新发生。什么冲突?那么profile_id上​​的唯一键就可以了。

我错过了什么?

如果你逐步解决问题,人们可以更好地想象它:>

编辑:( OP改变主意)

CREATE TABLE `profile_views` 
(  
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `profile_id` varchar(45) DEFAULT NULL,
    `counter` varchar(45) DEFAULT NULL,
    `date` date DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `combo_thingie1` (profile_id,`date`)  -- unique composite
) ENGINE=InnoDB auto_increment=150;

insert profile_views (id,profile_id,counter,date) values (113,2,36,'2015-08-27');

......

select * from profile_views;
+-----+------------+---------+------------+
| id  | profile_id | counter | date       |
+-----+------------+---------+------------+
| 113 | 2          | 36      | 2015-08-27 |
+-----+------------+---------+------------+

INSERT INTO profile_views (profile_id, counter, date) 
VALUES (2, 1, '2015-08-28') 
ON DUPLICATE KEY UPDATE counter = counter+1;

select * from profile_views;
+-----+------------+---------+------------+
| id  | profile_id | counter | date       |
+-----+------------+---------+------------+
| 113 | 2          | 36      | 2015-08-27 |
| 150 | 2          | 1       | 2015-08-28 |
+-----+------------+---------+------------+

INSERT INTO profile_views (profile_id, counter, date) 
VALUES (2, 1, '2015-08-27') 
ON DUPLICATE KEY UPDATE counter = counter+1;

select * from profile_views;
+-----+------------+---------+------------+
| id  | profile_id | counter | date       |
+-----+------------+---------+------------+
| 113 | 2          | 37      | 2015-08-27 |
| 150 | 2          | 1       | 2015-08-28 |
+-----+------------+---------+------------+

答案 1 :(得分:0)

我想出了这个疯狂的结构 - 它为新日期插入新记录,然后更新连续的插入语句 - 从而增加计数器。

   CREATE TABLE `profile_views` (
        `id` INT(11) NOT NULL AUTO_INCREMENT,
        `profile_id` VARCHAR(45) NOT NULL,
        `counter` VARCHAR(45) NOT NULL,
        `date` DATE NOT NULL,
        PRIMARY KEY (`id`, `profile_id`, `date`),
        UNIQUE INDEX `profile_id_date` (`profile_id`, `date`),
        UNIQUE INDEX `id_profile_id_date` (`id`, `profile_id`, `date`)
    )
    COLLATE='latin1_swedish_ci'
    ENGINE=InnoDB
    AUTO_INCREMENT=267;