我有一个包含3列和100多个条目/行的现有sql表。有一个带有自动增量的id列。
现在,我想在表的开头添加10个新行,id为1到10.但是我不能丢失任何现有的行。那么,我该怎么做呢?
我想到的一个想法是,我可以通过添加10来增加现有ID,例如1 + 10变为11,25 + 10变为35,然后我可以在开头添加行。这个IF的脚本可能是什么?
答案 0 :(得分:0)
您需要做的就是将该表的auto_increment设置为为要插入的新记录创建空间所需的数字。
例如,如果您插入ID为1-100的行,则可以:
运行以下命令检查下一个auto_increment值:
select auto_increment as val from information_schema.tables where table_schema='myschema' and table_name='mytable';
假设值为101(插入新行时将使用的值)。您可以通过运行以下来“提前”auto_increment值:
alter table myschema.mytable auto_increment = 111;
如果您插入这样的新行:
insert into mytable (not_the_id_column) values ('test');
它将获得111的“下一个”id。但是如果你手动指定id值,只要你使用任何小于111的值,你就可以了,所以你可以插入你想要的记录,如下所示: / p>
insert into mytable (id, not_the_id_column) values (101, 'test101');
insert into mytable (id, not_the_id_column) values (102, 'test102');
... -- more inserts as needed
现在,在更新PK值或任何依赖于它的值(外键或其他)时,您仍然必须采取适当的预防措施,但强制推进和/或回填id值是完全合法的,只要生成的auto_increment值不会复制表中已有的值。
答案 1 :(得分:-2)
我同意juergen的意见,你不应该这样做,但我发现有些事情必须要这样做。
SELECT MAX(id)-MIN(id)+1 INTO @x FROM theTable;
UPDATE theTable SET id = id + @x;
SELECT MIN(id) INTO @x FROM theTable;
UPDATE theTable SET id = 10 + id - @x;
如果id是主键,则更新中的值冲突可能导致MySQL拒绝更新。 (因此这对更新可以避免这种可能性。)
编辑:保理N.B.强烈反对这一点,在更新完成后验证表的下一个自动增量值不会与更新的记录冲突也可能是好的。我手边没有合适的数据库来验证UPDATE语句是否会影响它;即使它们确实影响了它,你最终也可能希望减少它,以免造成不必要的差距(理想情况下差距不应该是问题,但如果它们或者你只是温和的强迫症,那么值得研究)