【发布时间】:2016-08-07 03:35:42
【问题描述】:
我有三个表,Customer、PhoneNumber 和 PhoneCall。
PhoneNumber 包含电话号码,每个电话号码都属于一个客户。
PhoneCall 包含通话记录,并引用了被呼叫的客户以及被呼叫的电话号码。
我想创建一个约束,防止在引用的PhoneNumber 不属于引用的Customer 的PhoneCall 表中输入条目。
这是我的桌子:
Customer
Id
Name
PhoneNumber
Id
CustomerId (fk to Customer.Id)
AreaCode
Number
PhoneCall
CustomerId (fk to Customer.Id)
PhoneNumberId (fk to PhoneNumber.Id)
Description
Duration
客户和电话号码示例:
Customers = [
{ Id: 1, Name: 'Bob' },
{ Id: 2, Name: 'Richard' },
];
PhoneNumbers = [
{ Id: 1, CustomerId: 1, AreaCode: 'xxx', Number: 'xxxx' },
{ Id: 2, CustomerId: 2, AreaCode: 'yyy', Number: 'yyyy' }
];
我想阻止这样的条目:
PhoneCall = {
CustomerId: 1,
PhoneNumber: 2,
Description: 'call to customer',
Duration: 5
}
这似乎应该很容易通过约束来解决,但我真的很难弄清楚应该如何完成。有没有一种约束可以解决这个问题?
更新
感谢健太郎的回答。
我最喜欢它的地方在于,如果没有指定电话号码,我可以将 PhoneNumberId 设置为 null 来记录电话。
这是我用来添加约束的查询
ALTER TABLE [PhoneNumbers] ADD UNIQUE ([Id], [CustomerId]);
ALTER TABLE [dbo].[PhoneCalls] ADD CONSTRAINT [FK_dbo.PhoneCalls_dbo.ReferencedPhoneNumberMustBelongToReferencedCustomer] FOREIGN KEY([PhoneNumberId], [CustomerId]) REFERENCES [dbo].[PhoneNumbers] ([Id], [CustomerId]);
【问题讨论】:
-
我删除了不兼容的数据库标签。随意为您真正使用的数据库添加标签。
标签: sql sql-server foreign-keys constraints