【问题标题】:Mysql change values to insert on duplicate keyMysql更改值以插入重复键
【发布时间】:2017-10-19 10:47:17
【问题描述】:

有办法吗?考虑到我有下表:

 id | value
----|------
 1  | A
 2  | B

如果我尝试插入值(1, "C"),我会得到Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY',因为id 是唯一的主键。因此,我尝试使用以下插入语法在 AFTER INSERT ON 触发器中使用以下插入:

INSERT INTO table VALUES (NEW.id, NEW.value)
ON DUPLICATE KEY UPDATE NEW.id = NEW.id + 5000;

它会删除重复键错误,但不会插入重复键。

我按照瑜伽士的建议做了一个程序。这是它的样子:

DELIMITER //
CREATE PROCEDURE set_keys(IN id INT, IN value char(1))
BEGIN
    DECLARE CONTINUE HANDLER FOR 1062
    SELECT concat('Duplicate keys detected: ',id,', ',value) AS msg;

    INSERT INTO tests (id, value) VALUES(id + 5000, value);
END;
//

从现在开始做CALL set_keys(NEW.id, NEW.value); 是正确的做法吗?

【问题讨论】:

  • 使用自增键不是更简单吗?附:考虑到使用 ON DUPLICATE KEY UPDATE 您不会插入新行,只需编辑旧行,因此您的 1-A 变为 5001-A 并且 1-C 丢失
  • @RobertoBisello 会的,但是我正在从另一个数据库导入数据,除了插入之外,无法修改原始数据库。如果另一个数据库给了我 1-C,我应该能够插入它并保留列 value 中的两个值。

标签: mysql


【解决方案1】:

而不是直接执行INSERT INTO表,
您可以使用 PROCEDURE/FUNCTION 执行此操作。

EXCEPTION块下的DUPLICATE KEY错误进行异常处理,增加KEY列并重新运行INSERT语句

【讨论】:

  • 是否会创建一个类似于select count(*) from table where id = @id_to_insert 的函数并让“如果 count = 1,添加 5000”工作?对不起,我只是对 mysql 不太了解 :/
  • @Newwt -- 我看到的唯一问题是,在每次插入之前,我都会运行一个额外的查询,而与异常处理一样,我只会对重复记录运行额外的查询......
  • 我告诉自己一点,我想我按照你的建议做了。你介意检查我对这个问题的编辑,看看我做得对吗?感谢您迄今为止的帮助!
  • @Newwt- 是的,对我来说似乎是正确的。您需要正在使用的 CONTINUE HANDLER
  • 我刚才注意到,例如,如果我尝试在桌子上插入一个没有任何内容的 id 1,它会直接将其插入为id + 5000,而不会出现重复。是什么原因造成的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多