级联删除会删除非预期的记录

时间:2012-03-18 20:57:41

标签: mysql database foreign-key-relationship cascade

我通常在MS Access中开发并偶尔连接到MySQL后端。我有一个没有级联删除的MySQL后端,就像我在删除记录时所期望的那样。我想知道是不是因为我如何设置表关系(外键)。我不太了解MySQL知道我是否做得对。在设计器视图中,我使用MySQL中的设计器视图设置关系。对于tblInterviews中的复合主键字段(InterviewID,Coder ID),我为这两个主键字段中的每一个创建了两个与tblSB的单独关系(tblSB包括第三个字段,SBid,作为其复合PK)。设计器视图与Access略有不同,因为您不能一次突出显示多个字段来设置关系。我确实找到了讨论设置与外键关系的语法的论坛,但我不知道它是否与我在设计器中所做的相同。我怀疑不是因为当前我尝试删除InterviewID中CoderID的特定记录(唯一的InterviewID,CoderID组合)所有访谈记录时,CoderID组合被删除(并且这个级联到其他子表)以及)。我也想知道是否需要以我目前没有做的方式设置我的主键(例如,将其设置为索引)。任何帮助,将不胜感激。提前谢谢。

1 个答案:

答案 0 :(得分:0)

要查看您创建的内容,请查看DDL。 (显示创建表)

要强制执行外键约束(包括级联删除),您可能希望使用innodb引擎。 myisam引擎将接受声明外键的DDL,但它不会强制执行它们。

MySQL会让外键定位到一个非唯一列。 The MySQL docs

  

与SQL标准的偏差:引用的FOREIGN KEY约束   非UNIQUE键不是标准SQL。它是InnoDB的扩展   标准SQL。

他们称之为SQL的扩展。我称之为错误。

这意味着您可以将tblSB.interviewID声明为引用tblInterviews.interviewID的外键。标准SQL dbms不允许这样做。

5.6 docs

  

但是,系统不强制执行引用的要求   列为UNIQUE或声明为NOT NULL。外键的处理   对非唯一键或包含NULL值的键的引用不是   为UPDATE或DELETE CASCADE等操作定义良好。你是   建议使用仅引用UNIQUE和NOT NULL的外键   密钥。

以我的思维方式,他们说,“这是一个坏主意,但我们不知道如何解决它。所以你应该避免它。我们可以在你试用时警告你,但我们也不会这样做。“


根据你的评论,我会说这种约束是正确的。 。

CONSTRAINT tblInterviewRecordtblSB 
FOREIGN KEY (InterviewID, CoderID) 
  REFERENCES tblinterviewrecord (InterviewID, CoderID) 
  ON DELETE CASCADE ON UPDATE CASCADE

但这两个不是,应该删除。

CONSTRAINT tblSB_ibfk_1 
FOREIGN KEY (InterviewID) 
  REFERENCES tblinterviewrecord (InterviewID) 
  ON DELETE CASCADE ON UPDATE CASCADE, 
CONSTRAINT tblSB_ibfk_2 
FOREIGN KEY (CoderID) 
  REFERENCES tblinterviewrecord (CoderID) 
  ON DELETE CASCADE ON UPDATE CASCADE