无法创建外键约束

时间:2013-05-10 08:03:46

标签: sql sql-server visual-studio visual-studio-2012 foreign-keys

我有一个简单的地址簿,可以收集人员和公司信息。 所以我有以下3个表,然后是其他像电子邮件,电话号码,地址链接到联系人:

CREATE TABLE [dbo].[Contact] (
    [ID]        INT           IDENTITY (1, 1) NOT NULL,
    ...
    CONSTRAINT [PK_Contatto] PRIMARY KEY CLUSTERED ([ID] ASC)
);

CREATE TABLE [dbo].[Person] (
    [ID]            INT           IDENTITY (1, 1) NOT NULL,
    [IdContact]    INT           NOT NULL,
    [IdCompany]     INT           NULL,
    ...
    CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED ([ID] ASC),
    CONSTRAINT [FK_Person_Company] FOREIGN KEY ([IdCompany]) REFERENCES [dbo].[Company] ([ID]) ON DELETE SET NULL ON UPDATE CASCADE,
    CONSTRAINT [FK_Person_Contact] FOREIGN KEY ([IdContact]) REFERENCES [dbo].[Contact] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE [dbo].[Company] (
    [ID]          INT          IDENTITY (1, 1) NOT NULL,
    [IdContact]  INT          NOT NULL,
    ...
    CONSTRAINT [PK_Company] PRIMARY KEY CLUSTERED ([ID] ASC),
    CONSTRAINT [FK_Company_Contact] FOREIGN KEY ([IdContact]) REFERENCES [dbo].[Contact] ([ID]) ON DELETE CASCADE ON UPDATE CASCADE
);

基本上我希望如果有人删除联系人,也会删除与其关联的人/公司。此外,如果有人删除了与某个人关联的公司,则必须将该人的IdCompany设置为空。

由于“循环创建或其他传播路径创建”而无法创建的约束是FK_Person_Contact。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

我怀疑'循环创建'是因为Person表引用了Contact表而Company表和Company表也引用了Contact表。

人员记录和公司记录可以引用不同的联系人记录吗?

人A - >联系A.           - >公司A - >联系B

或者人员记录和公司记录是否应该引用相同的联系人?

人A - >联系A.           - >公司A - >联系A

联系人,人员和公司之间的关系如何定义?

  • 1联系人有很多人?
  • 1联系人有很多公司?
  • 1人有多个联系人?
  • 1人有1家公司?
  • 1人有很多公司?
  • 1公司有很多联系人?
  • 1公司有很多人?

您可能需要考虑一个或多个链接表来正确建模关系。