我已经创建了该表,并插入了以下值:
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”附近的语法不正确。
那么,我该如何解决呢?
如果提供适当的语法解决方案,这将非常有帮助。
答案 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