簡體   English   中英

SQL表-如何在舊的自動增量列的開頭添加行

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

我有3列和100多個條目/行的現有sql表。 有一個帶有自動增量的id列。

現在,我想在表的開頭添加10個新行,其ID從1到10。但是我不能丟失任何現有行。 那么,我該怎么做呢?

我想到的一個想法可能是我可以通過添加10來增加現有ID,例如1 + 10變為11,25 + 10變為35,然后可以在開頭添加行。 如果可能,此腳本將是什么?

為此,您所需要做的就是將該表的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');

它將獲得“下一個” ID111。但是,如果您手動指定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值或任何依賴於它的值(外鍵或其他)時,您仍然必須采取適當的預防措施,但是強制生成和自動回填id值是完全合法的,只要生成的auto_increment值不重復表中已有的值。

我同意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拒絕更新。 (因此請進行一對更新以避免這種可能性。)

編輯:考慮到NB對此的強烈反對,在完成更新后驗證表的下一個自動增量值不會與更新的記錄發生沖突也可能是一件好事。 我手頭沒有合適的數據庫來驗證UPDATE語句是否會影響它。 即使它們確實影響了它,您可能最終還是希望減少它,以免造成不必要的差距(理想情況下,間隙應該不是問題,但是如果它們是或您只是輕微的強迫症,則值得研究) 。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM