我通常在MS Access中开发并偶尔连接到MySQL后端。我有一个没有级联删除的MySQL后端,就像我在删除记录时所期望的那样。我想知道是不是因为我如何设置表关系(外键)。我不太了解MySQL知道我是否做得对。在设计器视图中,我使用MySQL中的设计器视图设置关系。对于tblInterviews中的复合主键字段(InterviewID,Coder ID),我为这两个主键字段中的每一个创建了两个与tblSB的单独关系(tblSB包括第三个字段,SBid,作为其复合PK)。设计器视图与Access略有不同,因为您不能一次突出显示多个字段来设置关系。我确实找到了讨论设置与外键关系的语法的论坛,但我不知道它是否与我在设计器中所做的相同。我怀疑不是因为当前我尝试删除InterviewID中CoderID的特定记录(唯一的InterviewID,CoderID组合)所有访谈记录时,CoderID组合被删除(并且这个级联到其他子表)以及)。我也想知道是否需要以我目前没有做的方式设置我的主键(例如,将其设置为索引)。任何帮助,将不胜感激。提前谢谢。
答案 0 :(得分:0)
要查看您创建的内容,请查看DDL。 (显示创建表)
要强制执行外键约束(包括级联删除),您可能希望使用innodb引擎。 myisam引擎将接受声明外键的DDL,但它不会强制执行它们。
MySQL会让外键定位到一个非唯一列。 The MySQL docs说
与SQL标准的偏差:引用的FOREIGN KEY约束 非UNIQUE键不是标准SQL。它是InnoDB的扩展 标准SQL。
他们称之为SQL的扩展。我称之为错误。
这意味着您可以将tblSB.interviewID声明为引用tblInterviews.interviewID的外键。标准SQL dbms不允许这样做。
但是,系统不强制执行引用的要求 列为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