Mysql — On Duplicate Key Update не работает для 2 ключей

Здравствуйте, у меня есть таблица с двумя уникальными ключами profile_id и date. Я не знаю, где проблема, но мой запрос не работает.

Таблица:

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;

В этом запросе я просто изменил дату, поэтому он должен вставить новую строку.

Мои желаемые результаты:

Если я изменяю дату, она меняет счетчик идентификаторов.
Я хочу хранить ежедневные просмотры профиля для каждого идентификатора профиля. Таким образом, если дата и идентификатор профиля совпадают, их приращение счетчик вставляет новую строку.

Любая помощь? Благодарю.

1

Решение

Схема:

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 |
+-----+------------+---------+------------+
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;
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector