使用带自动增量字段的触发器

时间:2013-05-27 00:30:11

标签: php mysql triggers

所以我目前正在为一个MMO(Massively mutliplayer online)创建一个数据库。 该数据库将列出游戏中的所有物品(护甲,武器,任务,npcs,e.t.c。)。我目前将它设置为每个不同类别在数据库中拥有自己的表的位置。即用于武器,装甲,e.t.c的表格。数据将显示在一个表格中,其名称将是一个链接,将该人带到一个关于他们点击的任何内容的详细页面。

对于每个表都有一个ID字段,该字段会自动递增,因此每行都有自己的ID。但由于我有多个不同的表,因此ID将重叠。由于链接的工作原理,这是不可接受的。我创建了一个名为“identifier”的第二个字段,默认值基于每个表。因此装甲表中此列的默认值是“armor”。

然后我创建了一个名为“组合”的第三个字段,现在这里是困难的部分!我创建了一个触发器,在将数据插入表之前,触发器使用CONCAT组合“id”字段和“identifier”字段并将其放入字段组合中。因此,无论我有多少桌子,都可以创建一个独特的id。但是,由于ID字段自动递增,触发器只是将0设置为不同的数字。这是触发器代码:

set new.combined = concat(new.id, new.identifier)   

这是在插入之前。

我尝试插入后插件但仍然出错。我在这里搜索了一些问题,无法找到问题的答案。有什么帮助吗?

2 个答案:

答案 0 :(得分:0)

如果所有“商品”具有相同数量的特征,为什么不创建商品表并使用枚举类型字段来区分商品类型,例如盔甲,武器,任务,npcs?

答案 1 :(得分:0)

对此的解决方案是为序列设置单独的表。 您的架构可能看起来像这样

CREATE TABLE item_seq
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE weapon
(
  id INT NOT NULL PRIMARY KEY DEFAULT 0, 
  name VARCHAR(32)
);
CREATE TABLE armor
(
  id INT NOT NULL PRIMARY KEY DEFAULT 0, 
  name VARCHAR(32)
);

武器表的触发器

DELIMITER $$
CREATE TRIGGER tg_weapon_beforeinsert 
BEFORE INSERT ON weapon
FOR EACH ROW
BEGIN
  INSERT INTO item_seq VALUES(NULL);
  SET NEW.id = LAST_INSERT_ID();
END$$
DELIMITER ;

装甲表的触发器将是相同的

DELIMITER $$
CREATE TRIGGER tg_armor_beforeinsert 
BEFORE INSERT ON armor
FOR EACH ROW
BEGIN
  INSERT INTO item_seq VALUES(NULL);
  SET NEW.id = LAST_INSERT_ID();
END$$
DELIMITER ;

现在,如果你在两个表中插入一些数据

INSERT INTO weapon(name) VALUES('weapon1');
INSERT INTO armor(name) VALUES('armor1');
INSERT INTO weapon(name) VALUES('weapon2');
INSERT INTO armor(name) VALUES('armor2');

武器表的内容

| ID |    NAME |
----------------
|  1 | weapon1 |
|  3 | weapon2 |

装甲表内容

| ID |   NAME |
---------------
|  2 | armor1 |
|  4 | armor2 |

这是 SQLFiddle 演示

相关问题