1

我有一个 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 在外键完整性检查期间的行为就像其他行(具有相同的引用键)根本不存在一样。例如,当RESTRICT对外键具有类型约束时,InnoDB 将阻止删除使用引用键的任何行,如果存在具有相同引用键的其他行,则事件。

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

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

任何意见表示赞赏。大卫


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

Abweichung von SQL-Standards: Wenn mehrere Zeilen in der Elterntabelle denselben Referenzschlüsselwert haben verhält sich InnoDB bei Fremdschlüsselprüfungen so, als würden die anderen Zeilen der Elterntabelle, also die mit demselben Schlüsselwert, gar nicht vorhanden。Wenn Sie beispielsweise einen RESTRICT-Typ-Constraint 定义 haben und es eine Kindzeile mit mehreren Elternzeilen gibt, verbietet InnoDB das Löschen irgendeiner dieser Elternzeilen。[网址:http ://dev.mysql.com/doc/refman/5.1/de/innodb-foreign-key-constraints.html ;访问时间:2013/10/03]

4

0 回答 0