我得到了像这样的Mysql表
CREATE TABLE IF NOT EXISTS tbl_member_doc_read (
`read_id` INTEGER(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT ,
`member_id` INTEGER(10) UNSIGNED NOT NULL ,
`doc_id` INTEGER(10) UNSIGNED NOT NULL ,
`status` INTEGER(1) DEFAULT '0',
FOREIGN KEY (`member_id`) REFERENCES tbl_member(`member_id`),
FOREIGN KEY (`doc_id`) REFERENCES tbl_doc(`doc_id`)
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
让我们说一下表
的示例数据read_id member_id doc_id status
1 1 1 1
2 1 2 0
3 2 2 1
现在我希望在该表中插入如果combine或pair(member_id,doc_id)存在则其他更新状态如果status为0。 这是我使用的SQL查询
INSERT INTO tbl_member_doc_read (member_id, doc_id, status) VALUES(1,2,1) ON DUPLICATE KEY UPDATE status = VALUES(status) WHERE status = 0;
它应该用数据2 1 2 1
更新第二行如果我插入此
INSERT INTO tbl_member_doc_read (member_id, doc_id, status) VALUES(2,1,0) ON DUPLICATE KEY UPDATE status = VALUES(status) WHERE status = 0;
它应该插入一个包含数据的新行4 2 1 0
但我无法解决这个问题。 而且我认为innodb引擎中的member_id和doc_id被引用到另一个表的主键,它们是唯一的。在innodb中,我无法创建独特的索引。
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:2)
为了处理ON DUPLICATE KEY UPDATE
语句,您需要在两列上定义unique
键,
CREATE TABLE IF NOT EXISTS tbl_member_doc_read
(
`read_id` INTEGER(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT ,
`member_id` INTEGER(10) UNSIGNED NOT NULL ,
`doc_id` INTEGER(10) UNSIGNED NOT NULL ,
`status` INTEGER(1) DEFAULT '0',
FOREIGN KEY (`member_id`) REFERENCES tbl_member(`member_id`),
FOREIGN KEY (`doc_id`) REFERENCES tbl_doc(`doc_id`),
CONSTRAINT tb_uq UNIQUE (member_id, doc_id)
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci;
然后删除WHERE
子句
INSERT INTO tbl_member_doc_read (member_id, doc_id, status)
VALUES(1,2,1)
ON DUPLICATE KEY UPDATE
status = VALUES(status)