【问题标题】:MySQL: Atomically inserting into a table and into a related table simultaniouslyMySQL:同时以原子方式插入表和相关表
【发布时间】:2017-07-31 06:45:11
【问题描述】:

我有两个表,一个带有自动生成主键的TaskLists 表和一个Tasks 表。一个TaskList 可以有多个Tasks

我现在如何插入一个TaskLists 行,同时在引用刚刚插入的对象的Tasks 表中自动插入多行。

【问题讨论】:

  • 你可以使用触发器
  • 需要用到事务,所以可以随意回滚或提交。

标签: mysql sql atomic


【解决方案1】:

根据广义相对论,这个宇宙中没有任何事情是“同时”发生的,所以你不能。 :)

但是,您可以启动一个事务,将一行插入TaskList,将相应的行插入Task,然后提交该事务。从某种意义上说,这肯定是“原子的”,您不能(永久)在数据库中写入部分数据。

如果TaskList的ID是自动递增的,你可以通过LAST_INSERT_ID得到它,然后将它用于Task的FK。

【讨论】:

    【解决方案2】:

    利用triggers 发生AFTER INSERT

    CREATE TRIGGER trigger_name
    AFTER INSERT
       ON TaskList FOR EACH ROW
    
    BEGIN
    
       -- Insert the rows to tasks now
    
       INSERT INTO tasks (TaskID) VALUES (NEW.TaskId);
    
       -- You can run several insert statements here
    END;
    

    如果您想使用来自TaskList 的值,请使用NEW.columname

    https://www.techonthenet.com/mysql/triggers/after_insert.php

    【讨论】:

    • 触发器本身不是原子的,如果它没有在事务中执行,如果一个查询由于某种原因失败,那么在出错之前的查询无论如何都会保持执行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多