我有一个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]