2017-10-19 60 views
0

有没有办法做到这一点?考虑到我有如下表:Mysql更改要插入复制密钥的值

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

如果我尝试插入,我得到Integrity constraint violation: 1062 Duplicate entry '1' for key 'PRIMARY'预期值(1, "C"),考虑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);正确的方法吗?

+0

不是简单的使用一个自动增加的关键?附:考虑使用ON DUPLICATE KEY UPDATE不插入新行,只需编辑旧行,以便您1-A变为5001-A并且1-C丢失 –

+0

@RobertoBisello它会的,但是我从中导入数据另一个数据库,并且不能修改除插入之外的原始数据库。如果其他数据库给我1-C,我应该可以插入它并保留列“value”中的两个值。 – Newwt

回答

1

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

待办事项异常处理重复键错误下EXCEPTION块,增加键列,并再次RE_RUN的INSERT语句

+0

会做一个像'select count(*)从id = @ id_to_insert'并且创建一个“if count = 1,add 5000”的工作吗?我很抱歉,我只是不知道* *有关mysql的很多信息:/ – Newwt

+0

@Newwt - 只有问题我看到你的答案是,在每次插入之前,我将运行一个额外的查询,在异常处理中,我将运行额外的查询重复记录只... – Yogi

+0

我告诉自己一点,我想 - 我做了你的建议。你介意检查我的编辑问题,看看我是否做得对吗?感谢你目前的帮助! – Newwt