【问题标题】:Double insert using value from previous insert使用先前插入的值进行双重插入
【发布时间】:2016-03-10 22:48:41
【问题描述】:

我有一个使用多表继承的简单数据结构:

Table: Event
cols: int **id**, int game_tick

Table Event_A
cols: int *id*, int dmg_taken

Table Event_B
cols: int *id*, float x, float y, float z

.. 和其他特定事件表

特定事件的 id 是与事件 id 相关联的外键约束,它是自动递增的。

所以问题是,如果我想在 Event_B 中创建一条记录,我必须先在 event_B 中创建一条记录,然后使用生成的 ID 作为新查询的输入。我是否可以将两个语句合二为一,或者强制 MySQL 使用某种传播,允许我简单地插入 Event_B 的记录并为我自动生成父事件记录?

是否可以在特定事件表上使用触发器来创建新事件,然后使用生成的 ID 作为表中 id 的默认值?

* 更新 *

我尝试使用以下嵌套 SQL 语句和 last_insert_id() 解决此问题(正如this question 的答案所建议的那样):

INSERT INTO event (game_tick) VALUES (10); 
select @id:=id as id from event where id = last_insert_id();
INSERT INTO event_b(id, x, y, z) VALUES (@id, '2', '2', '2');

当我使用 MySQL 工作台执行它时效果很好。但是,我在 SourceMod 工作,它的 MySQL 扩展似乎不支持嵌套查询。因此,当查询发送到 DB 驱动程序时,它会因语法错误而失败。

我也许可以只执行三个不同的查询,但我不确定这是否会在安排什么查询时产生竞争条件,因为可能会同时触发许多查询。

我的下一个方法是将它添加为 MySQL 中的 BEFORE INSERT 触发器,所以在 Table_B 上我有以下内容:

CREATE DEFINER = CURRENT_USER TRIGGER `MyDatabase`.`event_b_BEFORE_INSERT` 
BEFORE INSERT ON `event_b` FOR EACH ROW
BEGIN
    INSERT INTO event (game_tick) VALUES (10); 
    select @id:=id as id into @id FROM event where id = last_insert_id();
    IF (NEW.id IS NULL) THEN
      SET NEW.id = @id;
    END IF;
END

但是,我的问题是我将一个虚拟值 (10) 插入到父表 event.我可以将 game_tick 列添加到每个特定的事件类型,但如果可能的话,我想将所有事件的共享值保留在父类型表中。这怎么可能?

正如以下question 的答案中提到的那样,这个想法应该是在父表中拥有公共字段,但我不知道如何才能做到这一点,除非我还存储了游戏记号其他地方。

【问题讨论】:

    标签: mysql sql-insert multi-table-inheritance


    【解决方案1】:

    您可能需要使用

    LAST_INSERT_ID()
    

    示例代码如下:

    INSERT INTO event (game_tick) VALUES (10); 
    INSERT INTO event_b(id, x, y, z) VALUES (LAST_INSERT_ID(), '2', '2', '2');
    

    此函数将获取当前事务的最后插入的 ID。 如果你想在多个表中使用最后插入的 id,你需要像这样临时存储它。

    INSERT INTO event (game_tick) VALUES (10); 
    
    SET @lastid = LAST_INSERT_ID();
    
    INSERT INTO event_b(id, x, y, z) VALUES (@lastid, '2', '2', '2');
    INSERT INTO event_c(id, x, y, z) VALUES (@lastid, '3', '3', '3');
    

    更多信息可以在这里找到http://dev.mysql.com/doc/refman/5.7/en/getting-unique-id.html

    【讨论】:

    • 感谢您的回复,正如您在我的更新中看到的那样,这是我在 SO 上看到另一个问题后开始探索的路径。但是,如前所述,我真的很想避免嵌套查询。是否可以使用触发器来实现此功能?我现在正在尝试,但到目前为止没有任何运气。
    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多