一、前言
今天中國國壽XX項目XC環(huán)境達夢遇到id主鍵自增順序不對的問題,那么如何修改一個表的自增主鍵順序呢?下邊通過具體測試案例進行深入分析,通過delete/update/truncate/alter觀察數據的變換總結出結論,歡迎各位喜歡達夢數據的愛國人士一起研究學習一下。
二、delete/update/truncate/alter分別進行測試
1、創(chuàng)建測試表及基礎測試數據。
創(chuàng)建測試表
--創(chuàng)建測試表,定義id列自增
create table dmtest (id int IDENTITY(1,1) primary key,name varchar(10));
--插入測試數據并提交
set identity_insert dmtest on
insert into dmtest values(1,'張三'),(2,'李四'),(3,'王五');
commit;
set identity_insert dmtest off
--插入測試數據
insert into dmtest values('張三'),('李四'),('王五');
commit;
查看結果:
????????可以看出,設置列為主鍵自增不能重復,不需要賦值插入,默認從1自增。對自增列賦值需要設置SET IDENTITY_INSERT為ON時,才能對自增列賦值。命令如下:set identity_insert 表名 on;
如果指定id序列后不在指定,后續(xù)ID鍵值會根據目前最大值+1遞增,如下圖:
?2、delete操作主鍵自增變化。
?由此可見,delete刪除之后再insert,id列會按照刪除之前最大值+1進行自增,如果指定id大小插入后再insert也會按照刪除之前最大值+1進行自增,因此delete不會改變id自增屬性。
3、update?操作主鍵自增變化。
?此時update修改會報錯,提示:行附近出現錯誤[-2664]:試圖修改自增列[ID].因此,update無法對自增列進行修改。
4、truncate? 操作主鍵自增變化。
?truncate 表之后發(fā)現自增ID序列被重置,充實初始化到建表時狀態(tài),從1開始,步長為1進行自增。但是數據丟失了,如果數據量特別大,truncate之后再進行insert勢必會造成時間上的浪費。
5、刪除主鍵屬性后再添加,操作主鍵自增變化
?刪除主鍵自增屬性后再添加,無法重置屬性,仍然是按照最近一次修改的最大值+1自增。
三、總結
????????通過相關測試結論如下:
-
delete刪除之后再insert,id列會按照刪除之前最大值+1進行自增,如果指定id大小插入后再insert也會按照刪除之前最大值+1進行自增,因此delete不會改變id自增屬性。
-
update無法對自增列進行修改。
-
?truncate 表之后發(fā)現自增ID序列被重置,充實初始化到建表時狀態(tài),從1開始,步長為1進行自增,但是數據丟失了。
總之如下:
????????清空表清空表數據,新增數據時,主鍵仍然從未刪除之前的最后一條數據開始增加。
????????截斷表清空表數據,新增數據時,主鍵從1開始,相當于以下的兩條SQL。
四、解決方案
1、通過truncate table進行自增屬性初始化遞增,恢復到建表初始狀態(tài)。
2、在不刪除數據情況下如何進行ID自增主鍵初始化排序,從1開始。
手動指定序列號非自增。如下圖:
?不刪除數據進行序列自增從1開始。
alter table dmtest drop id;
alter table dmtest add id int IDENTITY(1, 1) not null primary key;
?結果如下圖:
文章來源:http://www.zghlxwxcb.cn/news/detail-488305.html
????????這個可以不刪除數據,但是會發(fā)生一個問題,就是ID,NAME列的順序發(fā)生了改變,而且達夢不像MySQL那樣支持添加字段可以指定在某個字段的前后,即 before、after指定添加列的位置??赡芎罄m(xù)版本會新增這個功能。文章來源地址http://www.zghlxwxcb.cn/news/detail-488305.html
到了這里,關于達夢數據庫,數據庫重置主鍵id從1開始的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!