Sql 是否有方法根据字段创建条件外键';s值多少?

Sql 是否有方法根据字段创建条件外键';s值多少?,sql,sql-server,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); 根据扫描类型值,我希望能够使用不同的外键 i、 e 如果[扫描类型]=“组织” 我希望[scan_

正在尝试创建一个表,如

 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);
根据扫描类型值,我希望能够使用不同的外键 i、 e

如果[扫描类型]=“组织” 我希望[scan_id]是Org的外键(scan_id)

如果[扫描类型]=“每”
我希望[scan_id]成为SQL Server中Per(scan_id)

的外键不可能创建动态外键,但您可以实现表继承,从而解决您的问题,例如:

创建表BaseScan(
Id INT主键,
共享属性…)

创建表格OrgScan(
Id INT…,
BaseScanId INT非空外键引用BaseScan(Id))

创建表dbo.PerScan(
Id INT…,
BaseScanId INT非空外键引用BaseScan(Id))


这样,您就可以在SearchUser中引用BaseScan.Id,然后根据“扫描类型”值加入所需的数据。

正如其他开发人员所提到的,简而言之,这是不可能的。但如果你想实现同样的目标,还是有希望的

可以对列应用检查约束。您可以创建用于检查的函数,并为检查约束调用它,如下所示

ALTER TABLE YourTable
ADD CONSTRAINT chk_CheckFunction CHECK ( dbo.CheckFunction() = 1 );
在函数中,您可以相应地编写逻辑

CREATE FUNCTION dbo.CheckFunction ()
RETURNS int
AS
BEGIN
  RETURN ( SELECT 1 );
END;

不,这是不可能直接实现的,尽管可能有其他方法可以满足您的需要。就个人而言,听起来您有设计缺陷,
Org
Per
应该是一个单独的表,带有一列
scan\u type
(然后
scan\u type
不会存储在表
SearchUser
).不幸的是,Org和Per无法合并,因为它们是在从API调用结果进行JSON反序列化期间创建的。在我看来,
Org
Per
应该有一个指向
SearchID
的外键,如果它们需要与此表相关;搜索将涉及一个组织或一个Per,或者两者都有,或者两者都没有。你的问题被广泛地用“多态关联”的名称来讨论。您将发现许多关于它的内容以及实现它的方法。OrgScan=组织扫描(包含OrgName位置e.t.c.)。PerScan=个人扫描(包含FirtName、LastName e.t.c.),因此属性不同;他们(可能)共享的唯一字段是扫描Id