【发布时间】:2016-12-30 14:58:54
【问题描述】:
这就是我的桌子的样子。
CREATE TABLE `answers` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`basicinfo_id` INT(11) NOT NULL,
`question_id` INT(11) NOT NULL,
`answer` INT(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX `question_id` (`question_id`),
INDEX `basicinfo_id` (`basicinfo_id`),
CONSTRAINT `basicinfo_id` FOREIGN KEY (`basicinfo_id`) REFERENCES `basic_info` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT `question_id` FOREIGN KEY (`question_id`) REFERENCES `questions` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION) COLLATE='latin1_swedish_ci' ENGINE=InnoDB AUTO_INCREMENT=3383;
这就是数据的样子
如果“basicinfo_id”的答案已经存在,我想更新它们。 要么 如果我更改 question_id 1、2 和 3 的答案。如何更新数据?
我已经尝试过这个查询,但它没有更新结果。
INSERT INTO answers (basicinfo_id, question_id, answer) VALUES('98', 1, '1'),('98', 2, '1'),('98', 3, '1'),('98', 4, '1'),('98', 5, '1') ON DUPLICATE KEY UPDATE basicinfo_id = 98;
我现在已经定义了一个复合唯一键,这就是它的样子,但它仍然不起作用。
CREATE TABLE `answers` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`basicinfo_id` INT(11) NOT NULL,
`question_id` INT(11) NOT NULL,
`answer` INT(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `basicinfo_id_question_id` (`basicinfo_id`, `question_id`),
INDEX `question_id` (`question_id`),
INDEX `basicinfo_id` (`basicinfo_id`),
CONSTRAINT `basicinfo_id` FOREIGN KEY (`basicinfo_id`) REFERENCES `basic_info` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT `question_id` FOREIGN KEY (`question_id`) REFERENCES `questions` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION ) COLLATE='latin1_swedish_ci' ENGINE=InnoDB AUTO_INCREMENT=3718;
【问题讨论】:
-
永远不会发生 upsert。您永远不会导致重复的密钥违规。只有当存在唯一键违规时,“重复键”的东西才会真正触发。没有密钥违规,没有更新。
-
如果我在这里有点无知,我很抱歉,但是如果我将 basicinfo_id 设置为 UNIQUE 它将不允许重复的 basicinfo_id 这是我不想要的但如果我将 basicinfo_id 和 question_id 都设置为复合唯一键那么这是可能的。我说的有道理吗?
-
是的,在这种情况下,您需要一个复合唯一键。
-
我在创建复合唯一键后尝试了相同的查询,但它仍然没有更新它。我正在将表模式添加到问题中。如果你能看看,我将不胜感激。
-
好吧,您正在插入一堆带有
id=98的记录,但唯一更新该字段的值是完全相同的值。所以... upsert 字面上没有意义,因为你用它自己替换了一个值。