SQL Server:带约束的增量数

时间:2018-10-08 04:07:04

标签: sql sql-server

我创建了一个表,该表将为客户创建一个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。

3 个答案:

答案 0 :(得分:2)

跳过数字即可。在任何数据库中,这都是正常现象,您不应期望数字永远保持连续。如果您不满意,请尝试使用GUID键。

答案 1 :(得分:1)

标识列值在收到请求后立即更新。因此,即使由于验证约束而导致插入失败时,该号码也已经被占用。

如果您的业务案例要求生成ID的确切顺序(保留插入顺序),则需要使用identity_insert设置为on手动设置ID列的值,然后增加最大ID。请注意,如果有多个这样的请求到来,则可能存在争用情况,其中尝试插入2个具有相同ID的记录,而第二个记录由于主要的ी约束而失败。

如果主键自动唯一,则请使用Guid字段。这将使您免于所有这些工作。

答案 2 :(得分:0)

简单的示例,您使用sequence进行自动递增。使用begin transaction将记录插入表中。但是无论您如何rollback进行该交易。 因此下一个insert将跳过该事务,因为它不会保留或将锁置于sequence上。 Sequence只会提高身份,完成其工作(如果您想使用或不使用它)。并按照最佳实践将其良好而健康地用于性能目的。