【问题标题】:PHP MySQL inserting data to multiple tablesPHP MySQL将数据插入多个表
【发布时间】:2010-12-07 15:47:41
【问题描述】:

我正在尝试制作一个实验性 Web 应用程序,以最大限度地减少冗余数据。 我设置了三个示例表,如下所示:

Table one
ID | created_at (unix timestamp) | updated_at (unix timestamp)

Table two
ID | Foreign Key to table one | Title

Table three (pages)
ID | Foreign Keys to both table one and two | Content | Metadata

这个想法是在应用程序中创建的所有内容都有一个创建/编辑时间。

许多(但不是全部)事物都会有标题(例如页面或页面要进入的部分)。

最后,有些东西会有自己特有的属性,例如页面的内容和元数据。

我正在尝试找出将数据输入多个表的最佳方法。我知道我可以从 PHP 执行多个插入查询,跟踪在当前事务中创建的行,并在事务的稍后部分失败时删除这些行。但是,如果 PHP 脚本完全死掉,它可能会在所有删除完成之前停止。

MySQL 是否有任何内置逻辑允许拆分插入查询?触发器是否能够处理此类事务或超出其能力范围?

任何建议、想法或想法将不胜感激。

谢谢!

【问题讨论】:

  • 您意识到当用户更改标题两次以上时,您无法确定哪个是原始标题?页面变得更糟......它还会人为地夸大你的数据,存储存档版本 - 这没关系,假设你想支持恢复到以前的版本。

标签: php mysql database insert


【解决方案1】:

一种解决方案是使用Transactions,它允许获得“全有或全无”行为。

思路如下:

  • 您开始交易
  • 您进行插入/更新
  • 如果一切正常,则提交事务;这将保存您在此交易中所做的一切
  • 如果没有,则回滚事务;您在其中所做的一切都将被取消。
  • 如果您不提交并断开连接(例如,如果您的 PHP 脚本死掉了),则不会提交任何内容,并且您在未提交事务期间所做的操作将自动回滚.

有关更多信息,您可以查看12.4.1. START TRANSACTION, COMMIT, and ROLLBACK Syntax,用于 MySQL。


请注意,事务仅适用于某些数据库引擎:

  • MyISAM 不支持事务
  • InnoDB 支持(例如,它还支持外键——它比 MyISAM 先进得多)

【讨论】:

    【解决方案2】:

    对于多个插入,您可以创建一个过程并在 PHP 上调用该过程。

    【讨论】:

      猜你喜欢
      • 2012-06-13
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-06-17
      • 2017-07-03
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多