grigor007
@grigor007
http://goldapp.ru

Как сделать on duplicate key "для нескольких ключей"?

Здравствуйте,

CREATE TABLE `user_notification` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `user_id` int(10) unsigned NOT NULL,
  `article_id` int(10) unsigned default NULL,
  `magazine_id` int(10) unsigned default NULL,
  `user_page_id` int(10) unsigned default NULL,
  `date_time` datetime NOT NULL,
  `unix_date` int(10) unsigned NOT NULL,
  `comment_id` int(10) unsigned NOT NULL,
  `is_subscribed` enum('1','0') collate utf8_unicode_ci NOT NULL,
  `status` enum('send','not_send') collate utf8_unicode_ci NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `user_id` (`user_id`,`article_id`,`magazine_id`,`user_page_id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;



Как мне сделать чтобы update был только если попадаются одинаковые значения в колонках: `user_id`,`article_id`,`magazine_id`,`user_page_id`


например уже есть эти поля со значениями:


1, 2, NULL, NULL


и я делаю

INSERT INTO `user_notification`
	(`user_id`,`article_id`,`magazine_id`,`user_page_id`,`date_time`,`unix_date`,`comment_id`,`is_subscribed`,`status`)
	values 
	(1,2,NULL,NULL,NOW(),UNIX_TIMESTAMP(),3,'1','not_send') 
	ON DUPLICATE KEY UPDATE
	`date_time` = NOW()
	, unix_date = UNIX_TIMESTAMP()
	, comment_id = 4



и выполнится в запросе должна ветка update


а если хотя бы в одном из этих полей есть различия, то выполнился бы insert…
  • Вопрос задан
  • 8274 просмотра
Пригласить эксперта
Ответы на вопрос 4
sdevalex
@sdevalex
Создайте уникальный индекс для 4 полей…
alter table user_notification add unique index(`user_id`,`article_id`,`magazine_id`,`user_page_id`);
Ответ написан
ivnik
@ivnik
Насколько я знаю ON DUPLICATE KEY UPDATE работает только с PRIMARY KEY. Т.е. чтобы использовать эту возможность вам придётся все эти поля занести в PK.
Ответ написан
grigor007
@grigor007 Автор вопроса
http://goldapp.ru
ужас, всё поехало.., извиняюсь…
Ответ написан
Комментировать
ivnik
@ivnik
Нужно из PK удалить поле id, т.е. чтобы ON DUPLICATE KEY UPDATE сработал должен произойти конфликт PK.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы