2016-08-23 38 views
0

这就是我的表的样子。如何执行MySQL UPSERT

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; 

这是数据如何能像

enter image description here

我想,如果他们已经存在“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; 
+2

永远不会发生更新插入。你永远不会导致重复的密钥违规。只有当存在唯一的密钥违规时,“重复密钥”才会实际触发。没有重点违规,没有更新。 –

+0

对不起,如果我来这里有点无知,但如果我设置basicinfo_id为UNIQUE它不会允许重复basicinfo_id,我不想但如果我设置basicinfo_id和question_id都作为复合独特的关键,那么它是可能的。我有什么意义吗? – Shaonline

+0

是的,在这种情况下,您需要一个复合唯一密钥。 –

回答

1

ON DUPLICATE KEY UPDATE basicinfo_id = 98;是畸形

试试这个: ON DUPLICATE KEY UPDATE 'answer' = VALUES('answer');

如果一个唯一的密钥已经存在,它会更新answer