我对数据库世界比较陌生,所以请耐心等待。我只是试图添加外键约束而且我不断收到错误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)
);
答案 0 :(得分:0)
规范化是完全错误的:
这个很好:
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
答案 1 :(得分:0)
无论您的设计是否关闭,您都无法声明对尚未创建的表格的外键引用。
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中有一个匹配的行。
我不知道为什么这对你的申请很重要。它可能是,但你还没有告诉我们你正在尝试建模的工作流程,所以我无法告诉你。