【问题标题】:Foreign key in mysql table- is the presence of target data necessary?mysql 表中的外键 - 是否需要存在目标数据?
【发布时间】:2011-10-31 07:41:35
【问题描述】:

我有两张桌子

TableA(id_A, name_A, info_A)

tableB(id_B, A_id, some_data) 外键(A_id) 引用tableA(id_A)

那么当我在B中插入一行,值XXX作为第二列id_A的值时,table_A是否必须有一行以XXX为id?

如果不是,那么我应该对表施加什么约束,以便表 B 仅引用存在的 table_A 行?

【问题讨论】:

    标签: mysql foreign-keys


    【解决方案1】:

    是的,如果 TableA.id_A 是主键,并且 TableB.A_id 具有引用该主键的外键约束,那么在 TableB.A_id 可以包含 XXX 之前,XXX 值必须存在于 TableA.id_A 中。

    这也意味着您不能删除或更改 TableA.id_A 中的 XXX 值,而 TableB.A_id 中存在值 XXX。您必须首先删除、更改或将 TableB.A_id 中的值设置为 NULL。您还可以使用 CASCADE 选项声明外键,以便 TableA 中的更改也自动应用于 TableB。但是,从属表中永远不能有“孤儿”值。

    请注意,如果您对 TableA 或 TableB 使用 MyISAM 存储引擎,那么您对外键约束的定义将被静默忽略,并且数据库不会在两个表之间强制执行任何引用完整性。您必须对两个表都使用 InnoDB 存储引擎才能获得对外键约束的支持。

    【讨论】:

    • 好的。那答案。我也有同样的印象,但是我的 MySQL 表表现得有点奇怪,因为我能够以我提到的方式添加行。 InnoDB 和 MyISAM 是真正的罪魁祸首。谢谢。
    • 请记得为对您有帮助的答案投票,并接受您问题的最佳答案。这是 StackOverflow 上的惯例。
    猜你喜欢
    • 2013-03-14
    • 1970-01-01
    • 2011-04-13
    • 2010-12-15
    • 2020-11-06
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2012-08-22
    相关资源
    最近更新 更多