使用上一个插入

时间:2016-03-10 22:48:42

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

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

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中创建一个记录,我必须首先在事件中创建一个记录,然后使用结果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扩展似乎不支持嵌套查询。因此,当查询发送到数据库驱动程序时,它会因语法错误而失败。

我可能只是执行三个不同的查询,但我不确定这是否会在查询调度时创建竞争条件,因为很多查询可能同时被触发。

我的下一个方法是在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的答案中所提到的那样,想法应该是在父表中包含公共字段,但我不知道如何才能完成这项工作,除非我也有游戏勾号存储在其他地方。

1 个答案:

答案 0 :(得分: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