自动递减级联主键

时间:2018-02-18 05:14:47

标签: mysql

我正在获取id为200,000 -500,000的数据,并尝试将其转换为演示数据。我想把它放在数据库的开头而不是中间。 ID不是连续的,由于其他数据被删除,因此增量存在间隙。

我尝试使用此命令

UPDATE table_name SET `id`=(`id`-200000)

它为第一组做得很好,但总共只有大约1000个记录,而且我仍然有200,000个范围内的东西。我愚蠢地认为我可以再次运行它,但是一旦尝试将数字的id分配给负1,它就会给我一个未签名的密钥错误。

我通常只是从insert语句中删除主键并将其重新插入到新数据库中,但在这种情况下,还有多个其他表具有自动级联的外键约束,以使其保持同步。

任何人都有一个有用的脚本,可以完成这样的任务吗?我不确定这种情况经常发生,但希望有人解决了这个问题。

更新

我尝试制作存储过程(我的第一个),但收到错误:unknown system variable 'id'

DROP PROCEDURE IF EXISTS proc_demo_decrement;
CREATE PROCEDURE proc_demo_decrement()
BEGIN
  DECLARE lastId INT DEFAULT 5;
  demo_loop : LOOP
    SET id = lastId +1;
        SET lastId = id;
    SELECT id; 
  END LOOP; 
END;

1 个答案:

答案 0 :(得分:0)

今晚学到了一些新技巧,这是存储过程:

DROP PROCEDURE IF EXISTS proc_demo_front_load;
CREATE PROCEDURE proc_demo_front_load()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE a,b INT DEFAULT 4;
  DECLARE cur1 CURSOR FOR SELECT id  FROM client ORDER BY id;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN cur1;

  read_loop: LOOP
  FETCH cur1 INTO b;
    IF done THEN
      LEAVE read_loop;
    END IF;
        UPDATE client SET id = a + 1 where id = b;
        SET a = a+1;

END LOOP;

  CLOSE cur1;
END;