SQL Server:varchar的身份和自动增量

时间:2019-03-30 08:55:54

标签: sql-server tsql

这是我在这个平台上的第一个问题。我正在做一个数据库项目。我想对id的主键使用自动增量,但也要在其前添加一个字母。除了使用2列将一个声明为标识并强制转换另一个列之外,还有其他方法吗?我曾经使用过存储过程和触发器。

谢谢

PS:如果可能的话,我想用一栏来做

1 个答案:

答案 0 :(得分:4)

仅一栏您将无法做到这一点。

最好的解决方案是使用

  • 一个ID INT IDENTITY(1,1)列以使SQL Server处理数字值的自动递增
  • 计算后的持久化列,可将该数字值转换为所需的值

所以尝试一下:

CREATE TABLE dbo.tblCompany
(
      ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
      CompanyID AS 'CMP-' + RIGHT('00000' + CAST(ID AS VARCHAR(5)), 5) PERSISTED,
      .... your other columns here....
)

现在,每次将行插入tblCompany而不为IDCompanyID指定值时:

INSERT INTO dbo.tblCompany(Col1, Col2, ..., ColN)
VALUES (Val1, Val2, ....., ValN)

然后,SQL Server将增加您的ID值,并且CompanyID将自动包含CMP-00001CMP-00002,......等值。在插入新行后,SQL Server会自动填充CompanyID列-因此不需要触发器或存储过程或其他任何东西-只需在表定义中使用此声明即可。

更新:如果您使用的是SQL Server 2012或更高版本,则只需一行即可-如果您还创建了SEQUENCE-像这样:

CREATE SEQUENCE SEQ_CompanyID
AS INT
START WITH 1000
INCREMENT BY 1;

CREATE TABLE dbo.Company
(
    CompanyID VARCHAR(20) NOT NULL
        CONSTRAINT DF_CompanyID
        DEFAULT('CMP-' + CAST(NEXT VALUE FOR dbo.SEQ_CompanyID AS VARCHAR(10))),
    CompanyName VARCHAR(100) NOT NULL,
    ----- other columns here
)

现在,如果您确定要在插入语句中插入省略 CompanyID列,就像这样:

INSERT INTO dbo.Company (CompanyName)
VALUES ('Company #1'), ('Company ABC'), ('Company Three');

然后,您再次获得CMP-1001', 'CMP-1002等作为CompanyID,由SQL Server在插入新行时自动处理。