【问题标题】:MySql Insert if not exist two column pair otherwise updateMySql 如果不存在则插入两列对否则更新
【发布时间】:2013-01-31 13:20:51
【问题描述】:

我得到了这样的 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;

让我们说那个表的示例数据ID

read_id  member_id  doc_id  status
 1          1           1       1
 2          1           2       0
 3          2           2       1

如果存在组合或配对 (member_id,doc_id),现在我想在该表中插入,否则如果状态为 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 中我无法创建唯一索引。

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • status 可以是 1 或 0 以外的任何值吗?如果不是,那么您的 WHERE 条件是多余的。
  • ON DUPLICATE KEY UPDATE 仅在您的表中有一个声明为 UNIQUE 的列时才有效

标签: mysql sql sql-insert


【解决方案1】:

为了使用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)

【讨论】:

  • 您的 SQLFiddle 演示链接已损坏。 :(
猜你喜欢
  • 2016-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2017-09-27
  • 1970-01-01
相关资源
最近更新 更多