如何避免InnoDb对非唯一外键列的缺点?

时间:2013-10-03 10:21:59

标签: mysql database database-design foreign-keys innodb

我有一个MySQL表,其中包含我们系统的翻译:

| topicID | languageKey | text            |
-------------------------------------------
| 1       | EN          | Hello!          |
| 1       | DE          | Hallo!          |
| 1       | ES          | ¡Hola!          |
| 2       | EN          | ....            |
| 2       | ES          | ....            |
-------------------------------------------

此表的组合主键是(textID,languageKey),可防止使用相同语言对主题进行多次翻译。

翻译的表使用InnoDb外键约束来同时引用主题的所有翻译。这里text列引用了翻译表中的topicID

| id   | text |
---------------
| 100  | 1    |
| 101  | 2    |
---------------

InnoDb表引擎具有以下约束,如德语文档中所述(翻译因为此信息未包含在英文文档中):

  

如果父表的多行具有相同的引用键,则InnoDB在外键完整性检查期间表现为好像其他行(具有相同的引用键)根本不存在。例如,当对外键InnoDB具有RESTRICT类型约束时,将阻止删除使用引用键的任何行,如果存在具有相同引用键的其他行,则会发生事件。

这导致无法删除,例如我的翻译表中的行与键1-ES

如何避免这种InnoDB行为?什么是最好的方法?例如。通过在我的翻译中添加isDeleted列来进行软删除?或者放弃所有约束并使用TRIGGERS来确保表的完整性?

任何评论都表示赞赏。 大卫


PS:以下是上述翻译的德语引文:

  

Abweichung von SQL-standards:Wenn mehrere Zeilen in der ElterntabelledenselbenReferenzschlüsselwerthabenverhältsichInnoDBbeiFremdschlüsselprüfungen所以,alswürdendieanderen Zeilen der Elterntabelle,也死于mitdemselbenSchlüsselwert,gar nicht vorhanden。 Wenn Sie beispielsweise einen RESTRICT-Typ-Constraint definiert haben und e eine Kindzeile mit mehreren Elternzeilen gibt,verbietet InnoDBdasLöschenirgendeinerdieser Elternzeilen。 [网址:http://dev.mysql.com/doc/refman/5.1/de/innodb-foreign-key-constraints.html;访问时间:2013/10/03]

0 个答案:

没有答案