我正在尝试创建一个关系,其中可能包含四个不同部分中的任何一个,但任何相同部分的集合都应该作为唯一处理。

实施例: 作业必须具有指定的公司,可以选择具有指定的位置,工作组和程序。 作业可能没有没有位置的工作组。

我们假设我们有公司A,B,C;位置X,Y,Z;工作组I,J,K和计划1,2,3。

如此有效的关系可能包括 A - X - I - 1 A - Z - 2 B - Y. C C - 3 B - Z - K

但无效关系将包括 A - K(没有位置的工作组) Y - K - 1(没有公司)

所以,要创建我的表,我已经创建了

companyID INT NOT NULL,
FOREIGN KEY companyKEY (companyID) REFERENCES company (companyID),
locationID INT,
FOREIGN KEY locationKEY (locationID) REFERENCES location (locationID),
workgroupID INT,
FOREIGN KEY workgroupKEY (workgroupID) REFERENCES workgroup (workgroupID),
programID INT,
FOREIGN KEY programKEY (programID) REFERENCES program (programID),
UNIQUE KEY companyLocationWorkgroupProgramKEY (companyID, locationID, workgroupID, programID)

我认为如果有一个工作组(我可以愉快地以编程方式或使用触发器,我认为这可以处理一个位置的任务的必要性,这将处理我的所有关系)

但是,当我测试此架构时,它允许我输入以下内容......

INSERT INTO test VALUES (1, null, null, null), (1, null, null, null);

......没有抱怨。我猜测(1,null,null,null)不等于它自己,因为包含了空值。如果是这种情况,我有什么方法可以处理这种关系吗?

任何帮助将不胜感激!

有帮助吗?

解决方案

这是一个特征(虽然不是我所期望的)。

此主题建议将您的密钥设为主键以获得您期望的行为:

  

这是一个功能 - NULL值是一个   未定义的值,因此两个NULL   价值观不一样。可以是一个   有点混乱但有意义的时候   你想一想。

     

UNIQUE索引可以确保这一点   非NULL值是唯一的;你可以   指定您的列不接受   NULL值。

其他提示

我能想到在没有额外触发器/编程的情况下处理这个问题的唯一方法就是使用单个“None of the Above”。每个引用表中的值,以便您的测试看起来像

INSERT INTO test VALUES (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM),
                        (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM)

NO _ * 标识符是ID列的正确类型/长度。这会失败,正如你所期望的那样。

在MySQL中NULL!= NULL或任何东西。这就是UNIQUE不起作用的地方。您应该使用空白的另一个默认值,例如零

我认为重要的是要注意有一种正确的方法可以解释和处理NULL值,并且OP所展示的行为正是预期的。你可以忽略这种行为,你可以按照你想要的任何方式处理你的查询,而不会反对我,但是“接受”可能会很好。答案描述了某种形式的最佳实践,而不是非标准的个人偏好。

或者,如果您不同意共识最佳实践,您可以不接受任何答案。

尽快接受答案并不是一场竞赛。我认为,审议和合作也是这个过程的一部分。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top