如何在另一个表中引用带有varchar前缀的自动递增ID?我希望我的用户能够使用带有前缀ED1501的Id登录,而不是他们的EmpNumber是1
CREATE TABLE Employee
(
EmpNumber int identity (1, 1),
Id as 'ED15'+right('00'+cast(EmpNumber as varchar(2)), 2) persisted,
EmpImage varchar(200),
TitleID int FOREIGN KEY REFERENCES Title(TitleID),
EmpTypeID int FOREIGN KEY REFERENCES EmployeeType(EmpTypeID),
PositionID int FOREIGN KEY REFERENCES Position(PositionID)NULL,
EmpName varchar (50),
EmpSurname varchar (50),
EmpDOB date,
EmpID_PassportNumber varchar (13),
EmpEmail varchar(255),
CountryID int FOREIGN KEY REFERENCES Country(CountryID),
ProvinceID int FOREIGN KEY REFERENCES Province(ProvinceID),
City varchar(50),
Suburb varchar (50),
Street varchar (50),
PostalCode varchar (4),
BankID int FOREIGN KEY REFERENCES Bank(BankID),
AccountNumber varchar (20),
TaxNumber varchar (20),
Salary float,
WorkingHours int,
constraint PK_Employee primary key (EmpNumber)
);
GO
CREATE TABLE LoginDetails
(
EmpNumber int FOREIGN KEY REFERENCES Employee(EmpNumber),
[Password] varchar(8),
SecurityQuestion varchar(50),
SecurityAnswer varchar(20)
);
GO
目前我正在使用EmpNumber引用,因为当我尝试使用id为varchar时引用数据类型错误。我想知道,因为当我转向设计表示层时,我希望用户输入他们的ID和密码而不是他们的EmpNumber。
答案 0 :(得分:0)
从X
< - >创建Declarative Referential Integrity (DRI)关系无法标准SQL中的Y + X
;虽然在查询这种关系方面技术上没有问题。
主列和外键列必须为DRI 共享相同的值。可以为Z = Y + X
< - >创建额外的Z
字段 1 。 Z
DRI协会;但重要的是要注意源和目标(现在已经引入冗余密钥)匹配。
无论如何,虽然上面是'标题问题',但它可能与“我希望我的用户能够使用Id登录”无关。要解决这个问题,只需使用“加入EmpNumber 2 ”更新“身份验证检查”查询 - - 即可将该字段用作“登录主体”;此任务本身不会要求使用“ED1”ID建立DRI,并且只会为EmpNumber列设置FK关系。
1 此字段通常必须在应用程序插入层或替代插入触发器处理。甚至SQL Server,甚至支持持久计算列,仍然是does not allow computed columns to be used in DRI。
2 例如:
select ..
from Employees e
join LoginDetails ld
on e.EmpNumber = ld.EmpNumber -- this is the Relationship: X <-> X
where e.Id = @theIdWithED1Prepended
and ld.password = @thePassword
另外,使用varchar(8)是'错误的',因为