1

所以我目前正在为 MMO(Massively mutliplayer online)创建一个数据库。该数据库将列出游戏中的所有物品(盔甲、武器、任务、NPC 等)。我目前将它设置为每个不同类别在数据库中都有自己的表。即武器、盔甲等的表格。数据将显示在表格中,并且无论它是什么名称都将是一个链接,该链接将把人带到有关他们点击的任何内容的详细页面。

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

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

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

这是在插入之前。

我尝试做一个插入后,但不断收到错误。我在这里搜索了问题,但找不到我的问题的答案。有什么帮助吗?

4

2 回答 2

0

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

于 2013-05-27T02:23:58.880 回答
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演示

于 2013-06-01T23:07:36.227 回答