2013-05-27 64 views
1

所以我目前正在爲一個MMO(Massively mutliplayer online)創建一個數據庫。 該數據庫將列出遊戲中的所有物品(盔甲,武器,任務,NPC,e.t.c)。我現在將它設置爲每個不同類別在數據庫中擁有自己的表的位置。例如武器,盔甲,電子表格等。數據將顯示在一個表格中,無論它是什麼名稱都將成爲一個鏈接,讓用戶訪問關於他們點擊的任何內容的詳細頁面。使用自動增量字段的觸發器

對於每個表我有一個ID字段,該自動遞增,因此每一行都有它自己的ID。但是由於我有多個不同的表格,ID將會重疊。這是不可接受的,因爲這些鏈接是如何工作的。我創建了一個名爲「標識符」的第二個字段,默認值基於每個表。所以裝甲表中這個列的默認值是「護甲」。

然後我創建了一個名爲「組合」的第三個字段,現在這裏是難題!我創建了一個觸發器,在將數據插入表之前,觸發器使用CONCAT將「id」字段和「identifier」字段組合在一起,並將其放入字段中。因此無論我擁有多少表格,都可以創建一個唯一的ID。但是,由於ID字段自動遞增,因此觸發器只會將0設置爲不同的數字。以下是觸發代碼:

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

這是在插入之前。

我嘗試做一個插入後,但不斷收到錯誤。我在這裏搜索了一些問題,無法找到解決問題的答案。任何幫助?

回答

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演示

+0

謝謝!對不起,接受這個答案需要很長時間。 – Kerblooy

+0

@Kerblooy我很高興它幫助:) – peterm

0

如果所有「項目」具有相同數量的特徵,爲什麼不創建項目表並且具有枚舉類型字段以區分項目的類型,例如,裝甲,武器,任務,NPC?