有什么区别?如果我有这两个表:
CREATE TABLE Account (Id int NOT NULL)
CREATE TABLE Customer (AccountId int NOT NULL)
我想要一个连接两者的外键,我应该做以下哪些以及为什么?
选项1:
ALTER TABLE [dbo].[Customer] WITH CHECK
ADD CONSTRAINT [FK_Accounts_Customers] FOREIGN KEY([AccountId])
REFERENCES [dbo].[Account] ([Id])
选项2:
ALTER TABLE [dbo].[Account] WITH CHECK
ADD CONSTRAINT [FK_Accounts_Customers] FOREIGN KEY([Id])
REFERENCES [dbo].[Customer] ([Id])
答案 0 :(得分:4)
取决于具体情况。每个客户都有客户吗?哪一个是父母?似乎帐户有多个客户,在这种情况下,引用属于Customer表。
现在,请说实际上,请致电实体CustomerID
和AccountID
。在主表上看起来似乎是多余的,但名称在整个模型中应该是一致的。
答案 1 :(得分:1)
我会使用从孩子到父母的外键。告诉问题是:如果您需要删除其中一个实体会发生什么?
答案 2 :(得分:0)
FK(外键)告诉DBMS列列表的子行的值必须作为列列表的子行的值出现在别处。每当发生这种情况时(并且其他声明都没有暗示),请声明FK。如果另外要在引用表的更改中将CASCADE操作应用于引用的表,请声明它。
(CASCADE没有什么特别之处,它不能用于非FK情况。它只是经常出现在FK上,并且有一个明确的FK图表,合理地限制他们的互动。)
如果有FK cycle,则需要使用触发器。您决定以声明的方式强制执行哪些约束。触发器应该考虑(期望的)约束图。