我在这里做错了什么
问题描述:
我对数据库世界比较陌生,对我来说很光鲜。我只是试图添加外键约束,我不断收到错误1215“无法添加外键约束”。我在这里做错了什么
CREATE TABLE InProcessSamples
(
SampleNumber Int(6),
WorkOrder Int(8),
DueDate Date,
BeginsTesting Date,
FinishedTesting Date,
CONSTRAINT fk_sample_number FOREIGN KEY(SampleNumber) REFERENCES AllRecords(SampleNumber),
CONSTRAINT fk_work_order FOREIGN KEY(WorkOrder) REFERENCES SamplesReceived(WorkOrder)
);
CREATE TABLE SamplesReceived
(
WorkOrder Int(8) PRIMARY KEY,
SampleNumber Int(6),
RecTimeStamp DateTime,
PartNumber Int(10),
Description Char(36),
CONSTRAINT fk_sample_number FOREIGN KEY(SampleNumber) REFERENCES AllRecords(SampleNumber),
CONSTRAINT fk_part_number FOREIGN KEY(PartNumber) REFERENCES PartNumbers(PartNumber)
);
CREATE TABLE AllRecords
(
SampleNumber Int(6) PRIMARY KEY,
WorkOrder Int(8),
DueDate Date,
BeginsTesting Date,
FinishedTesting Date,
RecTimeStamp DateTime,
MeasurementOne Double,
MeasurementTwo Double,
PassDielectric Char(3),
PassedAllTest Char(3),
CONSTRAINT fk_work_order FOREIGN KEY(WorkOrder) REFERENCES SamplesReceived(WorkOrder),
CONSTRAINT fk_part_number FOREIGN KEY(PartNumber) REFERENCES PartNumbers(PartNumber)
);
CREATE TABLE PartNumbers
(
PartNumber Int(10) PRIMARY KEY,
Description Char(36)
);
答
无论您的设计是否关闭,您都无法声明对尚未创建的表的外键引用。
CREATE TABLE
语句从SQL脚本的顶部到底部按顺序进行评估。当MySQL试图创建第一个表时,第二个和第三个表还不存在。所以外键没有什么可以引用的。
在创建具有引用外键的表之前,应该按照允许引用表存在的顺序创建表。在这种情况下,您有一个循环依赖关系,因此唯一的方法是创建SamplesReceived或AllRecords而不使用其某个外键,然后返回并添加该外键。
-
CREATE TABLE PartNumbers
,因为它是由SamplesReceived和AllRecords -
CREATE TABLE SamplesReceived
需要的,因为它是由InProcessSamples和AllRecords -
CREATE TABLE AllRecords
需要的,因为它是由InProcessSamples ALTER TABLE SamplesReceived ADD FOREIGN KEY(SampleNumber) REFERENCES AllRecords(SampleNumber);
CREATE TABLE InProcessSamples
即如果确实需要循环引用。
但正如其他人已经回答,或许你的循环引用不是一个很好的设计。
可能需要循环参考;在你的情况下,它强制执行的是对于SamplesReceived中的每一行,AllRecords中必须有一个匹配的行,反之亦然,AllRecords中的每行必须在SamplesReceived中具有匹配的行。
我不知道为什么这在您的应用程序中很重要。它可能是,但你没有告诉我们任何关于你想要建模的工作流程,所以我不知道。
答
正常化是完全错误的:
这个人是不错的:
Part
---------------
Part_id
Description
那么你有冗余和无处不等问题...
这个也许开始:
WorkOrder
-------------
workorder_id
Sample
----------
sample_id
workorder_id
part_id
Test
--------------
test_id
description
min_passing_value
max_passing_value
TestResult
---------------
testresult_id
test_id
description
result_value
test_date
sample_id
看起来像你有参考两个表之间的相同两个表 - 设计似乎关闭。 – Randy