【问题标题】:How do I update a record in a MySql database with multiple records connected in other tables?如何更新 MySql 数据库中的记录,并在其他表中连接多个记录?
【发布时间】:2012-02-25 07:42:38
【问题描述】:

我有一个有趣的问题。我有一个链接到其他几个表的 MySql 数据库表。例如,“主”表是一组教材,以及连接表:

  • 材料所针对的等级;
  • 该材料最适合的语法点;
  • 与材料相关的关键字

我希望能够更新和更改这些记录。更改主记录很容易,但是连接的记录呢?例如,假设我有一个教材,我原本打算教动词和形容词,最好用于 1-4 年级。现在稍后,我决定将 5 级添加到列表中,删除 1 级,并且该材料实际上更适合教授名词和形容词,而不是动词。

更新成绩表和语法表的最佳方法是什么?我不想无意中覆盖我想要保留的数据,也不想保留我想要删除的数据。我应该清除与该特定教材相关的所有记录并重新输入它们,还是有其他方法可以索引它们以便更有效地更新它们?

【问题讨论】:

    标签: mysql join database-design sql-update


    【解决方案1】:

    在 MySQL 中,您可以通过外键链接表。也就是说,您拥有共享这些密钥的连接记录。然后,根据您实例化表的方式,您可以在更新一个表中的值时使用CASCADE。从the manual on MySQL,当你定义这个外键时,你可以设置CASCADE如下:

    [CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]
    
    reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION
    

    地点:

    CASCADE:删除或更新父表中的行,并自动删除或更新子表中匹配的行。支持 ON DELETE CASCADE 和 ON UPDATE CASCADE。在两个表之间,不要定义多个作用于父表或子表中同一列的 ON UPDATE CASCADE 子句。

    默认情况下,此引用选项设置为No Action

    【讨论】:

    • 不要忘记外键只适用于 InnoDB 引擎。
    • @biz 真的吗?我只使用过 oracle,所以我不知道它不是通用的,但是 mySQL oracle 不是吗?
    • 不,MyISAM 引擎要笨得多,它绝对不符合 ACID,没有外键,没有事务。
    • 这里的问题是:让我们回到我在问题中提出的示例。用户进入编辑页面,添加一个等级,删除另一个等级,并对语法点执行相同操作。我可以运行哪些 sql 查询来完成此操作,而不会覆盖我想要保留的数据或留下我不再需要的孤立数据?一个简单的更新是行不通的,因为我要添加一件事,删除另一件事,然后让其他所有内容保持原样。我应该删除与父记录关联的所有记录并重新输入它们,还是有其他方法可以做到这一点?
    • 也就是说,你的回答教会了我一些新的东西,这肯定会对我有所帮助。谢谢!
    【解决方案2】:

    我有两张表,一张叫 Vendor,另一张叫 Inventory

    ++++++++++++++
    
     +Vendor
    
    ++++++++++++++
    
     +Vendor_ID 
     +Vendor_Name
    
     ++++++++++++++ 
    
     +++++++++++++++
    
     +Inventory
    
     +++++++++++++++
    
     +Description
    
     +endor_Name
    
     +Price
    
     +Weight
    
     +++++++++++++++ 
    

    目前两个表中的 Vendor_Name 具有相同的值,所以我可以这样做

    SELECT Vendor.Vendor_ID 
     FROM Vendor, Inventory 
     WHERE Vendor.Vendor_Name = Inventory.Vendor_Name
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 2014-09-01
      • 1970-01-01
      • 2012-03-31
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多