我有这个SQL查询:
INSERT INTO my_table
SELECT id, name, type
FROM other_table
我有这一行:1,鲍勃,男性
我尝试插入:1,鲍勃,男性
所以,我有一个重复的输入错误,我希望更改我的插入值,增加1,所以在我有两行之后:
如果我有重复的输入错误,我不想更新现有的行。插入会增加id值。所以,我认为ON DUPLICATE KEY
不是解决方案。
更新:
如果我使用这样的触发器:
DELIMITER |
CREATE TRIGGER incremente_primary BEFORE INSERT ON my_table FOR EACH ROW
BEGIN
IF( EXISTS( SELECT * FROM my_table )) THEN
SET NEW.id = NEW.id + 1;
END IF;
END |
DELIMITER ;
它不起作用,因为触发器只能读取一行。
答案 0 :(得分:1)
根据您的要求,您需要为您的id设置auto_increment属性,然后只插入除id之外的其他列,以便它可以像下面的auto_increment一样 -
INSERT INTO my_table (name,type)
SELECT name, type
FROM other_table;
如果您只是想忽略是否有重复,那么您可以使用 -
INSERT IGNORE INTO my_table
SELECT id,name, type
FROM other_table;
答案 1 :(得分:0)
确保主键不是名称或类型。因为只要不复制主键,就可以输入重复的行
答案 2 :(得分:0)
我找到了一个解决方案,我使用了一个游标:
DROP PROCEDURE proc_incremente;
DELIMITER |
CREATE PROCEDURE proc_incremente()
BEGIN
DECLARE var_name, var_type VARCHAR(100);
DECLARE var_id INT;
DECLARE end TINYINT(1) DEFAULT 0;
DECLARE cursor_incremente CURSOR
FOR SELECT * FROM other_table;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET end = 1;
OPEN cursor_incremente;
loop_cursor: LOOP
FETCH cursor_incremente INTO var_id, var_name, var_type;
IF end = 1 THEN
LEAVE loop_cursor;
END IF;
WHILE ( EXISTS( SELECT * my_table WHERE id = var_id) IS TRUE) DO
SET var_id = var_id + 1;
END WHILE;
INSERT INTO my_table(id,name,type) VALUES(var_id,var_name,var_type);
END LOOP;
CLOSE cursor_incremente;
END |
DELIMITER ;
CALL proc_incremente();