我有一个使用多表继承的简单数据结构:
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() 来解决这个问题(正如这个问题的答案所建议的那样):
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) 插入到父表事件中。我可以将 game_tick 列添加到每个特定的事件类型,但如果可能的话,我想将所有事件的共享值保留在父类型表中。这怎么可能?
正如对以下问题的回答中所提到的,这个想法应该是在父表中拥有公共字段,但我不知道如何使这项工作发挥作用,除非我还将游戏记号存储在其他地方。