我对SQL很新。我在这里遇到问题,我无法创建对主键的外键引用,该主键是带前缀(S0001,S0002
等的自动增量)。
这是我的SQL查询
CREATE TABLE Staff
(
No int NOT NULL IDENTITY (1,1),
Staff_ID AS 'S' + RIGHT('000' + CAST(No as varchar(10)), 3) PERSISTED,
CONSTRAINT PK_Staff PRIMARY KEY CLUSTERED (Staff_ID),
Staff_Name varchar(30),
Staff_Username varchar(30),
Staff_Password varchar(30),
Staff_Email varchar(30),
);
和
CREATE TABLE Manager
(
No int NOT NULL IDENTITY (1,1),
Staff_ID AS 'S' + RIGHT('000' + CAST(No as varchar(10)),3),
CONSTRAINT FK_Staff_ID FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_ID) ON DELETE CASCADE,
Manager_Name varchar (30),
Manager_Email varchar (30),
);
如您所见,我创建了2个表Staff
和Manager
,我想在引用Manager
的{{1}}中创建一个外键。但最终它返回我的错误信息:
Msg 1764,Level 16,State 1,Line 1
表'Manager'中的计算列'Staff_ID'在'FOREIGN KEY CONSTRAINT'中无效,因为它没有保留。
Msg 1750,Level 16,State 0,Line 1
无法创建约束。查看以前的错误。
我已经尝试将Staff.Staff_ID
添加到PERSISTED
查询中,并且能够创建Manager
表,但是当我手动键入值时,它会返回一条错误消息。< / p>
Manager
手动插入值
CREATE TABLE Manager
(
No int NOT NULL IDENTITY (1,1),
Staff_ID AS 'S' + RIGHT('000' + CAST(No as varchar(10)),3) PERSISTED,
CONSTRAINT FK_Staff_ID FOREIGN KEY (Staff_ID) REFERENCES Staff(Staff_ID) ON DELETE CASCADE,
Manager_Name varchar (30),
Manager_Email varchar (30),
);
并出现错误消息。
Msg 271,Level 16,State 1,Line 1
无法修改“Staff_ID”列,因为它是计算列或是UNION运算符的结果。
有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
您无法为计算字段插入值。插入没有它以使用下一个标识:
INSERT INTO Manager (Manager_Name, Manager_Email)
VALUES ('Kelvin', 'scammerforever@gmail.com')
如果要指定字段,则应指定其所基于的值,即标识字段。您可以使用identity_insert
setting覆盖标识:
set identity_insert Manager on
INSERT INTO Manager (No, Manager_Name, Manager_Email)
VALUES (2, 'Kelvin', 'scammerforever@gmail.com')
set identity_insert Manager off
答案 1 :(得分:0)
不需要在insert语句中指定计算列
试试这个
INSERT INTO Manager (Manager_Name,Manager_Email)
VALUES ('Kelvin','scammerforever@gmail.com')
它会自动计算并将值插入staff_Id