我创建了一个表,该表将为客户创建一个ID,该ID是一个数字,从101开始,并为每个客户加1。因此,第一个客户的ID为101,第二个客户的ID为102,依此类推。除了ID,我还有其他信息,分别是名字和姓氏。我还添加了一个约束,该约束适用于名字和姓氏列,这将强制条目由字母组成。
这是SQL语句:
CREATE TABLE tblcustomer
(
CUST_ID INT NOT NULL IDENTITY(101,1) PRIMARY KEY,
FIRST_NAME VARCHAR(15) NOT NULL,
LAST_NAME VARCHAR(15) NOT NULL,
CONSTRAINT firstlet CHECK (FIRST_NAME NOT LIKE '%[^a-zA-Z]%'
AND LAST_NAME NOT LIKE '%[^a-zA-Z]%')
);
除一个小问题外,此操作按预期工作。当我尝试为名字插入数字时,约束将起作用并且不向表中输入任何内容。但是,当我正确插入名字和姓氏时,它将把信息添加到表中,但是CUST_ID将跳过数字。
插入示例:
insert into tblcustomer(FIRST_NAME,LAST_NAME) values ('Bob','Smith');
insert into tblcustomer(FIRST_NAME,LAST_NAME) values ('Greg','Johns');
insert into tblcustomer(FIRST_NAME,LAST_NAME) values ('Todd','123');
insert into tblcustomer(FIRST_NAME,LAST_NAME) values ('Todd','Howe');
输出:
CUST_ID FIRST_NAME LAST_NAME
-----------------------------
101 Bob Smith
102 Greg Johns
104 Todd Howe
因此CUST_ID
显示104的位置实际上应该是103。
答案 0 :(得分:2)
跳过数字即可。在任何数据库中,这都是正常现象,您不应期望数字永远保持连续。如果您不满意,请尝试使用GUID键。
答案 1 :(得分:1)
标识列值在收到请求后立即更新。因此,即使由于验证约束而导致插入失败时,该号码也已经被占用。
如果您的业务案例要求生成ID的确切顺序(保留插入顺序),则需要使用identity_insert设置为on手动设置ID列的值,然后增加最大ID。请注意,如果有多个这样的请求到来,则可能存在争用情况,其中尝试插入2个具有相同ID的记录,而第二个记录由于主要的ी约束而失败。
如果主键自动唯一,则请使用Guid字段。这将使您免于所有这些工作。
答案 2 :(得分:0)
简单的示例,您使用sequence
进行自动递增。使用begin transaction
将记录插入表中。但是无论您如何rollback
进行该交易。
因此下一个insert
将跳过该事务,因为它不会保留或将锁置于sequence
上。
Sequence
只会提高身份,完成其工作(如果您想使用或不使用它)。并按照最佳实践将其良好而健康地用于性能目的。