如何为主键列创建自定义的自动生成的ID号?

时间:2018-08-05 09:32:37

标签: sql sql-server

我已经创建了该表,并插入了以下值:

CREATE TABLE Product
(
     ID INTEGER IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
     Product_No AS RIGHT ('PDT0000' + CAST(ID AS VARCHAR(10)),10) PERSISTED,
     Product_Name VARCHAR(50) NOT NULL
)

INSERT INTO Product(Product_Name)
VALUES('Fish'), ('Shrimp'), ('Crab')

然后使用

SELECT * 
FROM Product

我得到以下结果:

ID  Product_No  Product_Name
1   PDT00001    Fish
2   PDT00002    Shrimp
3   PDT00003    Crab

如您所见,ID是主键列..不是Product_No ...我希望Product_No在这里是主键列,而无需创建ID列。因此,这是我想通过

获得的输出
SELECT * 
FROM Product     (with Product_No as the Primary Key):

Product_No  Product_Name
-------------------------
PDT00001    Fish
PDT00002    Shrimp
PDT00003    Crab

这就是我尝试过的:

CREATE TABLE Product
(
     Product_No INTEGER IDENTITY(1,1) PRIMARY KEY ('PDT0000' + Product_No AS VARCHAR(10)),10),
     Product_Name VARCHAR(50) NOT NULL
)

这是我收到的以下错误:

  

“ PDT0000”附近的语法不正确。

那么,我该如何解决呢?

如果提供适当的语法解决方案,这将非常有帮助。

3 个答案:

答案 0 :(得分:3)

如果要将Product_No用作主键-只需使用以下SQL语法:

CREATE TABLE Product
(
     ID INTEGER IDENTITY(1,1) NOT NULL
          CONSTRAINT UC_Product_ID UNIQUE,
     Product_No AS RIGHT ('PDT0000' + CAST(ID AS VARCHAR(10)), 10) PERSISTED 
          CONSTRAINT PK_Product PRIMARY KEY CLUSTERED,
     Product_Name VARCHAR(50) NOT NULL
)

现在您的列Product_No 是该表的主键。您不能IDENTITY值列和计算出的列规范合并到一个列中-只是不可能。

但是:即使有了这个,以及您的样本数据,这个查询:

SELECT * 
FROM Product

仍然返回此结果:

ID  Product_No  Product_Name
------------------------------
1   PDT00001    Fish
2   PDT00002    Shrimp
3   PDT00003    Crab

但是输出结果错误是什么?我不太了解您的情况为什么会这样?

如果您不想(或为其创建)ID列,只需运行以下查询:

SELECT Product_No, Product_Name
FROM Product

获得此结果:

Product_No  Product_Name
------------------------------
PDT00001    Fish
PDT00002    Shrimp
PDT00003    Crab

答案 1 :(得分:0)

很可能您希望product_no之间没有空隙。如您所知,当事务回滚时,标识值将跳过该值。因此,如果您希望Product_no是连续的,则不要使用身份。
另外,在没有任何其他用途的情况下增加一个额外的列(ID)会很麻烦。
之后,在SQL‌ Server 2017中引入了顺序的概念,您可以使用它。
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-2017

答案 2 :(得分:0)

  

我希望Product_No成为此处的主键列,而无需   创建ID列。

使用序列,您可以不需要ID列。 EG

--drop table if exists Product
--drop sequence seq_Product
go

create sequence seq_Product
start with 1
increment by 1 

go

CREATE TABLE Product
(
     Product_No varchar(20) PRIMARY KEY 
        default 'PDT' + format((next value for seq_Product),'00000' ),
     Product_Name VARCHAR(50) NOT NULL
)

insert into Product(Product_Name)
values ('Fish'),('Shrimp'),('Crab')



select * from Product