【问题标题】:How to update the PRIMARY KEY/FOREIGN KEY in other related tables?如何更新其他相关表中的 PRIMARY KEY/FOREIGN KEY?
【发布时间】:2013-10-29 13:46:30
【问题描述】:

墙壁

  • wall_id (P)
  • 墙名
  • wall_views
  • wall_downloads
  • wall_thumbnail_path

(4, 'wall4', '125', '574', '../.../thumbnail_wall4.jpg')

类型

  • type_id
  • 类型名称

('1', 'Desktop') ('2', 'Phone') ('3', 'Tablet')

wall_types

  • wall_id (P) (F)
  • type_id (P) (F)

(4, 1)

以上是我拥有的表,我想做的是自动从walls 表中获取wall_id = 4 并将其存储在wall_types 表中,与types 表中的type_id 相同。如何才能做到这一点?实现此目的的代码(PHP 代码)或 SQL 语句是什么?谢谢!

注意:

  • wall_types 中的wall_id 引用walls 表中的wall_id

  • types 中的type_id 引用types 表中的type_id

【问题讨论】:

  • 自动是什么意思?在插入 wall_types 表之前,您总是需要知道需要哪个 type_id。该值需要来自某个地方(例如用户输入),所以我不知道您所说的自动是什么意思?
  • wall_id 的值在墙壁表中将来自墙壁表本身,因为它的 AUTO INCREMENT,所以如果前面的记录是 wall_id = 4 下一个将是 wall_id = 5 我想添加到wall_types 表和类型将由上传者通过选中复选框来指定
  • 所以如果上传者选择桌面作为类型,它将从类型表中取 1 并将其与 wall_id = 5 一起存储在 wall_types 中,因此新记录将是 (5, 1)

标签: php mysql database foreign-keys primary-key


【解决方案1】:

下面的查询在您的 wall_types 表中插入一个新关系,其中“1”来自用户输入(用户选择“桌面”):

INSERT INTO wall_types (wall_id, type_id) VALUES (5,1);

如果您想在插入新的“墙”行后立即执行此操作,其中 id (当然)未知,您可以使用 LAST_INSERT_ID(),这将包含最后插入的 id,因此您需要执行这个查询就在“墙”插入查询之后:

INSERT INTO wall_types (wall_id, type_id) VALUES (LAST_INSERT_ID(),1);

【讨论】:

  • 你可以在你的墙壁行被添加的查询之后执行这个。
  • 有点像那样......因为我将使用一个脚本更新表格。这是最有效的解决方案吗?
  • 是的,我认为是!没有必要为此创建一个 mysql 触发器,这对你想要的东西来说有点过分了,这让你更好地了解正在发生的事情。
  • 我可以使用带有 LAST_INSERT_ID() 的连续查询,因为我将更新其他几个具有相同 wall_id 的表吗?
  • LAST_INSERT_ID() 为您提供数据库中最后插入的 id(主键)。因此,如果您在它之后执行另一个查询,它可能会被覆盖。在这种情况下,您可以使用 mysql(i)_insert_id 将 id 存储在 php 变量中(请参阅:php.net/manual/en/function.mysql-insert-id.php
【解决方案2】:

如果您想“自动”执行此操作,您可以使用触发器来更新关系。 另一种方法是删除 wall_types 中的关系并使用更新的值重新创建。

【讨论】:

    猜你喜欢
    • 2016-11-12
    • 2012-11-20
    • 1970-01-01
    • 2021-05-14
    • 2012-02-08
    • 2022-12-21
    • 2021-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多