【问题标题】:Update Composite Key On Duplicate Key [duplicate]在重复键上更新复合键
【发布时间】:2015-03-20 15:17:56
【问题描述】:

我需要同时更新新行:date='$dat'empId='$who(作为复合键)。但如果其中之一或两者不同,则插入:

$sql= "INSERT INTO history 
       SET endtimestamp='$now',end='$signature',date='$dat',empId='$who' 
       ON DUPLICATE KEY UPDATE endtimestamp='$now',end='$signature'";

【问题讨论】:

  • 你没有问问题。您在这些字段上是否有唯一键?
  • 都是主键
  • 那是什么问题。
  • 如果 date != '$dat' 或 empId != '$who (注意它不等于 != ) ,它的更新不会插入新的
  • 如果 2 两者相等,我需要更新它,如果两者或其中之一不同,则插入!

标签: php mysql syntax


【解决方案1】:

来自 MySQL 文档: http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

如果您指定 ON DUPLICATE KEY UPDATE,并插入一行 会导致 UNIQUE 索引PRIMARY KEY 中的重复值, 更新旧行。

主键是单独的(每列)。您需要创建一个包含两列的复合 UNIQUE 索引,然后更新才能正常工作。

在数据库上运行:

CREATE UNIQUE INDEX unq_employee_id_date ON history (empId, date);

【讨论】:

  • 能否请您运行SHOW INDEX FROM history; 并发布输出,以便我查看表上设置了哪些索引?
  • history 0 PRIMARY 1 empId A NULL NULL NULL BTREE history 0 PRIMARY 2 date A 2 NULL NULL BTREE history 0 date 1 date A 2 NULL NULL BTREE history 0 unq_employee_id_date 1 empId A NULL NULL NULL BTREE history 0 unq_employee_id_date 2 日期 A 2 NULL NULL BTREE 历史 1 empId 1 empId A NULL NULL NULL BTREE
  • 我不知道您已经设置了应该可以正常工作的复合主键。很可能是其他索引引起了问题。运行这些命令以删除其他索引并重试:ALTER TABLE history DROP INDEX `unq_employee_id_date`ALTER TABLE history DROP INDEX `date`ALTER TABLE history DROP INDEX `empId`
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
相关资源
最近更新 更多