无法使用自动增量和前缀创建对主键的外键引用

时间:2014-11-05 17:19:15

标签: sql sql-server-2012 foreign-keys primary-key auto-increment

我对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个表StaffManager,我想在引用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运算符的结果。

有什么方法可以解决这个问题吗?

2 个答案:

答案 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