Sql Oracle中的自动增量(删除后调整ID序列)

Sql Oracle中的自动增量(删除后调整ID序列),sql,oracle,Sql,Oracle,假设我从这个表中删除了一条记录- CREATE TABLE test (id NUMBER PRIMARY KEY, name VARCHAR2(30)); CREATE SEQUENCE test1_sequence START WITH 1 INCREMENT BY 1; INSERT INTO test (id, name) VALUES (test1_sequence.nextval,'Jon'); INSERT INTO test (id, name) VALUES (test1_

假设我从这个表中删除了一条记录-

CREATE TABLE test
(id NUMBER PRIMARY KEY,
name VARCHAR2(30));

CREATE SEQUENCE test1_sequence
START WITH 1
INCREMENT BY 1;

INSERT INTO test (id, name) VALUES (test1_sequence.nextval,'Jon');
INSERT INTO test (id, name) VALUES (test1_sequence.nextval,'Hello');
INSERT INTO test (id, name) VALUES (test1_sequence.nextval,'Matt');
INSERT INTO test (id, name) VALUES (test1_sequence.nextval,'Bork');
然后,如果我选择查询-

delete from test where id='2';
然后我得到

select * from test;
因此,如果我需要维护id的顺序,比如一旦我删除任何数据,它就会自动调整id。所以我应该把这张桌子作为

  ID  Name    
  1    Jon    
  3    Matt
  4    Bork

如果我从Ask Tom网站上的文章中记错了,那么sequence并不能保证它会生成无间隙的数字。因此,填充表和生成ID的方式永远不会100%没有间隙(即使不删除行)

以下是关于该主题的一篇文章:

还要记住,您正在更新(似乎是)主键列


我的建议是不要这样做。如果您需要一个有序的行列表,请使用ROW_NUMBER并将PK保留为代理键,而不附加任何“应用程序含义”。

首先为什么要这样做?@Adrian,不这样做有什么缺点吗?我同意@Adrian。你为什么要这么做。您还必须使用该ID作为外键对其他所有内容重新编号。@RaihanJamal一点也不!但我可以列举一些这样做的缺点:1。你必须时不时地做这件事。您将如何跟踪历史数据(客户机A为3,然后更改为2,所有其他相关数据如何?)并且列表将继续…在我看来,您根本不应该在PK上排序。如果需要一个连续的行列表,只需在查询中添加一个分析函数,如ROW_NUMBER。
ID  Name    
1    Jon    
2    Matt
3    Bork