在 MS SQL 服务器中跨多个表共享基于相同列的复合外键
Sharing composite foreign key based on the same columns across multiple tables in MS SQL Server
我有多个 table 的数据库,其中包含有关不同工具(货币、基金、股票等)的信息。所有仪器都有 Type
和 Id
字段,代表仪器的唯一键。我还有一个 table InstrumentMeta
用于收集所有以 (Type,Id)
作为主键的工具的统计信息。
Instrument_1 - Type(int), Id(string), Values, ...
Instrument_2 - Type(int), Id(string), Code, ...
- ...
InstrumentMeta - Type(int), Id(string), PerformanceValue1, PerformanceValue2, PerformanceValue3
是否可以为 InstrumentMeta
table 和所有 Instrument_
table 创建基于同一对 (Type, Id)
的外键?
简短的回答是"No!"这与复合键无关,对所有键都是如此。外键必须指定键引用的 ONE table。
但是,您必须有一个包含所有不同键值组合的 "master" table。据我所知,它可能是元 table,因为它必须包含所有 Type/Id 值。所以这是主table,所有"instrument_x" table都是子table。
子table包含引用回主table的FK。这是一个例子。
create table Meta(
Type varchar( 16 ) not null,
ID smallint not null,
<other meta fields>,
constraint PK_Meta primary key( Type, ID ),
constraint CK_Meta_Type check( Type in( 'Currency', 'Fund', 'Equity' ))
);
create table Currencies(
Type varchar( 16 ) not null,
ID smallint not null,
<other currency fields>,
constraint PK_Currencies primary key( Type, ID ),
constraint CK_Currencies_Type check( Type = 'Currency' ),
constraint FK_Currencies_Meta foreign key( Type, ID )
references Meta( Type, ID )
);
create table Funds(
Type varchar( 16 ) not null,
ID smallint not null,
<other fund fields>,
constraint PK_Funds primary key( Type, ID ),
constraint CK_Funds_Type check( Type = 'Fund' ),
constraint FK_Funds_Meta foreign key( Type, ID )
references Meta( Type, ID )
);
等等。
此设计强制您在元 table 中输入 "Currency:42" 行,然后才能在货币 table 中创建 ID 42。但无论如何这可能是一个非常好的主意。
我有多个 table 的数据库,其中包含有关不同工具(货币、基金、股票等)的信息。所有仪器都有 Type
和 Id
字段,代表仪器的唯一键。我还有一个 table InstrumentMeta
用于收集所有以 (Type,Id)
作为主键的工具的统计信息。
Instrument_1 - Type(int), Id(string), Values, ...
Instrument_2 - Type(int), Id(string), Code, ...
- ...
InstrumentMeta - Type(int), Id(string), PerformanceValue1, PerformanceValue2, PerformanceValue3
是否可以为 InstrumentMeta
table 和所有 Instrument_
table 创建基于同一对 (Type, Id)
的外键?
简短的回答是"No!"这与复合键无关,对所有键都是如此。外键必须指定键引用的 ONE table。
但是,您必须有一个包含所有不同键值组合的 "master" table。据我所知,它可能是元 table,因为它必须包含所有 Type/Id 值。所以这是主table,所有"instrument_x" table都是子table。
子table包含引用回主table的FK。这是一个例子。
create table Meta(
Type varchar( 16 ) not null,
ID smallint not null,
<other meta fields>,
constraint PK_Meta primary key( Type, ID ),
constraint CK_Meta_Type check( Type in( 'Currency', 'Fund', 'Equity' ))
);
create table Currencies(
Type varchar( 16 ) not null,
ID smallint not null,
<other currency fields>,
constraint PK_Currencies primary key( Type, ID ),
constraint CK_Currencies_Type check( Type = 'Currency' ),
constraint FK_Currencies_Meta foreign key( Type, ID )
references Meta( Type, ID )
);
create table Funds(
Type varchar( 16 ) not null,
ID smallint not null,
<other fund fields>,
constraint PK_Funds primary key( Type, ID ),
constraint CK_Funds_Type check( Type = 'Fund' ),
constraint FK_Funds_Meta foreign key( Type, ID )
references Meta( Type, ID )
);
等等。
此设计强制您在元 table 中输入 "Currency:42" 行,然后才能在货币 table 中创建 ID 42。但无论如何这可能是一个非常好的主意。