如果重复输入

时间:2015-07-07 05:11:18

标签: mysql

我有这个SQL查询:

INSERT INTO my_table
SELECT id, name, type
FROM other_table

我有这一行:1,鲍勃,男性

我尝试插入:1,鲍勃,男性

所以,我有一个重复的输入错误,我希望更改我的插入值,增加1,所以在我有两行之后:

  1. bob,male< = NOT UPDATED
  2. 鲍勃,雄性
  3. 如果我有重复的输入错误,我不想更新现有的行。插入会增加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 ;
    

    它不起作用,因为触发器只能读取一行。

3 个答案:

答案 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();