一个外键在不同的SQL SERVER表中接受两个主键

一个外键在不同的SQL SERVER表中接受两个主键,sql,sql-server,Sql,Sql Server,我有3个表,2个表有主键,1个表有外键 这就是一个例子 TABLE 1 -------- Id1 INT PRIMARY KEY Name TABLE 2 ------- Id2 INT PRIMARY KEY Name TABLE 3 ------- Id (Foreign key Table 1 & Table 2) 问题是,当我在表3中插入一些id时,表1中存在而表2中不存在。她给我错误,请提供帮助?您可以定义一个列,使其与两个不同的表具有外键关系: constraint

我有3个表,2个表有主键,1个表有外键 这就是一个例子

TABLE 1
--------
Id1 INT PRIMARY KEY
Name

TABLE 2
-------
Id2  INT PRIMARY KEY
Name


TABLE 3
-------
Id (Foreign key Table 1 & Table 2)
问题是,当我在表3中插入一些id时,表1中存在而表2中不存在。她给我错误,请提供帮助?

您可以定义一个列,使其与两个不同的表具有外键关系:

constraint fk_table3_table1_name foreign key (name) references table1(name)
constraint fk_table3_table23_name foreign key (name) references table2(name)
但是,这需要
名称
在两个基表中。因此,在实践中,表从来没有这样定义过

听起来好像您有数据建模问题。但是你没有在问题中提供足够的信息来提供更好的答案。一种可能是两列和一个生成的列和检查约束:

create table table3 . . .
    name1 varchar(255),
    name2 varchar(255),
    name as (coalesce(name1, name2)),
    check (name1 is null or name2 is null),  -- at least one doesn't have a value
    constraint fk_table3_table1_name foreign key (name1) references table1(name)
    constraint fk_table3_table23_name foreign key (name2) references table2(name)
注意:您也不应该将字符串用作外键。数字标识(INT)是一个更好的选择。

您可以定义一个列,使其与两个不同的表具有外键关系:

constraint fk_table3_table1_name foreign key (name) references table1(name)
constraint fk_table3_table23_name foreign key (name) references table2(name)
但是,这需要
名称
在两个基表中。因此,在实践中,表从来没有这样定义过

听起来好像您有数据建模问题。但是你没有在问题中提供足够的信息来提供更好的答案。一种可能是两列和一个生成的列和检查约束:

create table table3 . . .
    name1 varchar(255),
    name2 varchar(255),
    name as (coalesce(name1, name2)),
    check (name1 is null or name2 is null),  -- at least one doesn't have a value
    constraint fk_table3_table1_name foreign key (name1) references table1(name)
    constraint fk_table3_table23_name foreign key (name2) references table2(name)

注意:您也不应该将字符串用作外键。数字ID(INT)是一个更好的选择。

她给我的错误“名称在“外键约束”中无效,因为它没有持久化。”@Marco_Paoulo。那是个打字错误。外键引用应该引用基本列,而不是计算列。@Gordon Linoff-“数字ID是更好的选择”-那么,您是说,即使有可用的自然PK(例如,可以用作PK的GUID,或PK的多个列),也始终使用代理键吗?我知道Tom Kyte总是说如果有一个自然PK可用,你应该使用它(参考:)。@dcp。这取决于多种因素,但我通常选择合成键。毕竟,GUID是16字节(用于每个外键引用),很难输入和读取。整数是4字节,更易于写入和读取。她给我的错误是“名称在“外键约束”中无效,因为它未被持久化”。@Marco_Paoulo。那是个打字错误。外键引用应该引用基本列,而不是计算列。@Gordon Linoff-“数字ID是更好的选择”-那么,您是说,即使有可用的自然PK(例如,可以用作PK的GUID,或PK的多个列),也始终使用代理键吗?我知道Tom Kyte总是说如果有一个自然PK可用,你应该使用它(参考:)。@dcp。这取决于多种因素,但我通常选择合成键。毕竟,GUID是16字节(用于每个外键引用),很难输入和读取。整数是4个字节,更易于写入和读取。