SQL Table - 如何在旧的自动增量列的开头添加一行

SQL Table - How to add a row at the start of an old autoincrement column

我现有的 sql table 有 3 列和 100+ entries/rows。有一个带有自动增量的 id 列。

现在,我想在 table 的开头添加 10 行 ID 为 1 到 10 的新行。但我不能丢失任何现有行。那么,我该怎么做呢?

我刚刚想到的一个想法是,也许我可以通过添加 10 来增加现有的 id,比如 1+10 变成 11,25+10 变成 35,然后我可以在开头添加行。如果可能的话,这个脚本是什么?

我同意 juergen d 的评论,即你不应该这样做,但我意识到在某些情况下必须这样做。

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. 的强烈反对纳入其中,验证 table 的下一个自动增量值不会与更新的冲突更新完成后的记录。我手头没有合适的数据库来验证 UPDATE 语句是否影响它;即使它们确实影响了它,您可能最终还是想减少它,以免造成不必要的差距(理想情况下,差距应该不是问题,但如果它们是或您只是轻度强迫症,则值得研究) .

为此,您需要做的就是将 table 的 auto_increment 设置为您需要为要插入的新记录创建 space 的任何数字。

例如,如果您插入了 ID 为 1-100 的行,您可能:

通过运行检查下一个auto_increment值:

select auto_increment as val from information_schema.tables where table_schema='myschema' and table_name='mytable';

我们假设该值为 101(插入新行时将使用的值)。您可以通过 运行:

"advance" auto_increment 值
alter table myschema.mytable auto_increment = 111;

如果像这样插入新行:

insert into mytable (not_the_id_column) values ('test');

它会得到 111 的 "next" id。但是如果你手动指定 id 值,在这种情况下只要你使用任何小于 111 的值就可以了,这样你就可以插入你想要的记录像这样:

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 值或任何依赖于它的值(外键或其他)时采取适当的预防措施,但是强制提前 and/or 回填 id 值是完全合法的,只要生成的 auto_increment 值不与 table.

中已有的值重复