我在这里做错了什么

问题描述:

我对数据库世界比较陌生,对我来说很光鲜。我只是试图添加外键约束,我不断收到错误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

看起来像你有参考两个表之间的相同两个表 - 设计似乎关闭。 – Randy

无论您的设计是否关闭,您都无法声明对尚未创建的表的外键引用。

CREATE TABLE语句从SQL脚本的顶部到底部按顺序进行评估。当MySQL试图创建第一个表时,第二个和第三个表还不存在。所以外键没有什么可以引用的。

在创建具有引用外键的表之前,应该按照允许引用表存在的顺序创建表。在这种情况下,您有一个循环依赖关系,因此唯一的方法是创建SamplesReceived或AllRecords而不使用其某个外键,然后返回并添加该外键。

  1. CREATE TABLE PartNumbers,因为它是由SamplesReceived和AllRecords
  2. CREATE TABLE SamplesReceived需要的,因为它是由InProcessSamples和AllRecords
  3. CREATE TABLE AllRecords需要的,因为它是由InProcessSamples
  4. ALTER TABLE SamplesReceived ADD FOREIGN KEY(SampleNumber) REFERENCES AllRecords(SampleNumber);
  5. 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