这是我在这个平台上的第一个问题。我正在做一个数据库项目。我想对id
的主键使用自动增量,但也要在其前添加一个字母。除了使用2列将一个声明为标识并强制转换另一个列之外,还有其他方法吗?我曾经使用过存储过程和触发器。
谢谢
PS:如果可能的话,我想用一栏来做
答案 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
而不为ID
或CompanyID
指定值时:
INSERT INTO dbo.tblCompany(Col1, Col2, ..., ColN)
VALUES (Val1, Val2, ....., ValN)
然后,SQL Server将增加您的ID
值,并且CompanyID
将自动包含CMP-00001
,CMP-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在插入新行时自动处理。