【问题标题】:MySQL foreign key relations vs mysql_insert_id to relate tablesMySQL外键关系与mysql_insert_id关联表
【发布时间】:2011-11-11 14:13:06
【问题描述】:

这是一种概念证明草案,以使事情正常运行,但不希望有完全废话的代码。对于我的数据库,我尝试使用 innoDB 获取真正的外键关系,但无法获取。

我决定不使用外键,而是在插入后提取 mysql_insert_id(),将其保存为变量,然后将该变量放入相关表中。

这很可怕吗?一切似乎都运行良好,我可以根据需要连接和关联 ID。使用外键对我的方法有什么好处(除了更新/删除级联)?

【问题讨论】:

  • 如果我理解正确,您正在做类似mysql_query('INSERT INTO master...'); $master_id = mysqsl_insert_id(); mysql_query("INSERT INTO detail (master_id, ...) values ('$master_id', ...)"); 的事情。那么不,这并不可怕,这是您创建关系唯一可以做的事情。唯一的另一种方法是使用"natural keys" 或您的应用程序生成的密钥,但唯一的区别是您没有使用mysql_insert_id 获得ID,而是从用户那里获得。外键到底是什么意思?
  • 我正在尝试比较使用 mysql_insert_id 将关系实际烘焙到数据库中:ADD CONSTRAINT 'mytable' FOREIGN KEY ('my_id') REFERENCES 'othertable' ('other_id') ON DELETE CASCADE ON UPDATE CASCADE;
  • 不让我编辑我的评论,但要确认您的假设:是的,这正是我正在做的。
  • 感谢您的澄清,我现在添加了一个答案 - 我希望它能回答您的问题。

标签: php mysql foreign-keys relational-database mysql-insert-id


【解决方案1】:

要创建关系(master->detail),您必须始终自己提供密钥,使用mysql_insert_id、自然密钥或应用程序生成的密钥。 FOREIGN KEY 不会让那个为你工作。

FOREIGN KEY 所做的是

  • 帮助您加强数据的关系/完整性(因此“详细”记录不会指向无效的父级)
  • 处理主记录的删除或关键更改(ON DELETE ...、ON UPDATE ...)。
  • 如果“master_id”行尚不存在,它还会在“详细信息”表中为“master_id”行创建一个索引(好吧,您也可以在没有FOREIGN KEY 的情况下这样做)
  • 还有某种记录目的,例如,ERM 工具可以根据您的架构重新设计关系模型(好吧,这一点有点远)

与好处相比,添加FOREIGN KEY 约束语句的成本很小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多