【发布时间】:2017-12-18 19:33:12
【问题描述】:
我有三个表,比如说 tableA、tableB、tableC。 这些表的关系是:
- tableA 到 tableB 分别是一对多
- tableB 到 tableC 分别是一对多
tableA:
CREATE TABLE tableA (
id int Not Null,
name varchar(50) Not Null,
Area varchar(20) Not Null,
CONSTRAINT PK_tableA PRIMARY KEY NONCLUSTERED(id Asc) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90)
)
tableB:
CREATE TABLE tableB (
id int Not Null,
appNbr int NOT NULL,
appCode char(8) NOT NULL,
tableAId int Not Null,
beginDt datetime Not Null,
EndDt datetime Not Null,
updatedDt datetime Not Null,
CONSTRAINT PK_tableB PRIMARY KEY NONCLUSTERED(
id Asc,
appNbr ASC,
appCode ASC,
tableAid ASC,
beginDt ASC,
endDt ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90)
)
GO
ALTER TABLE tableB WITH CHECK ADD CONSTRAINT FK_tableB_tableAId FOREIGN KEY(tableAId)
REFERENCES tableA (Id)
GO
ALTER TABLE tableB CHECK CONSTRAINT FK_tableB_tableAId
GO
tableC:
CREATE TABLE tableC (
id int Not Null,
tableBId int Not Null,
beginDt datetime Not Null,
endDt datetime Not Null,
indicator char(1) Not Null,
contactId int Not Null
UpdateDt datetime Not Null,
CONSTRAINT PK_tableC PRIMARY KEY NONCLUSTERED(
id ASC,
tableBId Asc,
beginDt ASC,
endDt ASC
) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90)
)
ALTER TABLE tableC WITH CHECK ADD CONSTRAINT FK_tableC_tableBId FOREIGN KEY(tableBId)
REFERENCES tableB (Id)
GO
ALTER TABLE tableC CHECK CONSTRAINT FK_tableC_tableBId
GO
这里的问题是当我运行脚本来创建表 C 时它显示如下错误
There are no primary or candidate keys in the referenced table
'dbo.tableB' that match the referencing column list in the
foreign key 'FK_tableC_tableBId'.
Msg 1750, Level 16, State 0, Line 2
Could not create constraint. See previous errors.
在谷歌上研究后,我知道不允许从复合主键中创建外键。因此,我决定将 id 作为我的主键,并将剩余字段(appNbr、appCode、tableAid、beginDt 和 endDt)作为表 B 上的逻辑键。我已经阅读了一些关于逻辑键的在线资料,但无法理解。
谁能解释一下什么是逻辑键以及如何在我的示例中使用它。
【问题讨论】:
-
感谢 Aaron,在发布上述问题之前,我已经查看了该链接。你能详细说明一下逻辑键吗?
标签: sql sql-server tsql constraints