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