试图创建一个像这样的表
CREATE TABLE SearchUser(
SearchID int NOT NULL PRIMARY KEY,
UserID int FOREIGN KEY REFERENCES Users(UserId),
[scan_id] NVARCHAR(8),
[scan_type] NVARCHAR(3),
[tokens_left] INT);
在哪里取决于scan_type值,我希望能够利用不同的外键 即
如果[scan_type] ='ORG' 我希望[scan_id]是组织(scan_id)的外键
如果[scan_type] ='PER' 我希望[scan_id]是Per(scan_id)的外键
答案 0 :(得分:1)
在SQL Server中无法创建动态外键,但是,您可以实现表继承,从而解决您的问题,例如:
创建表BaseScan(
Id INT PRIMARY KEY,
SharedProperties ....);
创建表OrgScan(
ID INT ...,
BaseScanId INT非空外键引用BaseScan(Id));
创建表dbo.PerScan(
ID INT ...,
BaseScanId INT非空外键引用BaseScan(Id));
这样,您将能够在SearchUser中引用BaseScan.Id,然后根据“扫描类型”值将所需的数据联接起来。
答案 1 :(得分:0)
正如其他开发人员所提到的,简而言之是不可能的。但是仍然有希望实现相同的希望。
您可以在列上应用检查约束。您可以创建用于检查的函数,并为检查约束调用它,如下所示。
ALTER TABLE YourTable
ADD CONSTRAINT chk_CheckFunction CHECK ( dbo.CheckFunction() = 1 );
在功能上,您可以相应地编写逻辑。
CREATE FUNCTION dbo.CheckFunction ()
RETURNS int
AS
BEGIN
RETURN ( SELECT 1 );
END;