有没有一种方法可以根据字段的值创建条件外键?

时间:2019-09-10 11:58:13

标签: sql sql-server

试图创建一个像这样的表

 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)的外键

2 个答案:

答案 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;
相关问题