我在这里做错了什么

时间:2016-11-12 15:54:40

标签: mysql foreign-keys

我对数据库世界比较陌生,所以请耐心等待。我只是试图添加外键约束而且我不断收到错误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)
  );

2 个答案:

答案 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而不使用其中一个外键,然后返回并添加该外键。

  1. CREATE TABLE PartNumbers,因为SamplesReceived和AllRecords需要它
  2. CREATE TABLE SamplesReceived,因为InProcessSamples和AllRecords需要它
  3. CREATE TABLE AllRecords,因为InProcessSamples
  4. 需要它
  5. ALTER TABLE SamplesReceived ADD FOREIGN KEY(SampleNumber) REFERENCES AllRecords(SampleNumber);
  6. CREATE TABLE InProcessSamples
  7. 如果确实需要循环引用。

    但正如其他人已经回答的那样,也许你的循环引用并不是一个好的设计。

    可能需要循环参考;它在你的情况下强制执行的是,对于SamplesReceived中的每一行,你必须在AllRecords中有一个匹配的行,反之亦然,AllRecords中的每一行必须在SamplesReceived中有一个匹配的行。

    我不知道为什么这对你的申请很重要。它可能是,但你还没有告诉我们你正在尝试建模的工作流程,所以我无法告诉你。