【问题标题】:Cannot create Foreign Key Constraint无法创建外键约束
【发布时间】:2013-05-04 20:49:10
【问题描述】:

我有一个简单的地址簿,用于收集人员和公司信息。 所以我有以下 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
);

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

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

我错过了什么?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    或者个人记录和公司记录是否应该引用同一个联系人?

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

    Contact、Person 和 Company 之间的关系是如何定义的?

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

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

    【讨论】:

    • 联系人指的是个人或公司。所以 Person 和 company 不能指代同一个联系人。联系几个地址/电话号码/电子邮件已连接。 Person.IdCompany 可以指一家公司(如果它适用于该公司)。我可以将 Person.IdCompany 连接到该公司的联系人而不是直接连接到公司表吗?
    • 您可能会更好地将联系人链接到个人和个人到公司。换句话说,联系人是可能为公司工作或可能不为公司工作的人;联系人通过个人链接到公司。您仍然可以通过人员 - 公司链接找到与公司关联的所有人员。
    • 抱歉,不能这样做。此地址簿链接到属于租赁服务的更大数据库,因此联系人可能仅指没有任何参考人的公司。联系人可以是租车人,也可以是租车公司。一个人可能偶尔会为公司工作,但也可以为私人目的租一辆车。你觉得我说的怎么样? Person FK to Contact 和 FK to Company 只能通过公司联系方式,而不是像现在这样直接。所以不再进行三角剖分,而是全部以“V”形图案通过联系表。合法吗?
    • 是的,删除从个人到公司的直接链接并通过联系人链接应该可以满足您的需求。
    • 您也许可以通过触发器或在您的(非 SQL)代码中实现这一点,而不是使用级联更新/删除。
    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多