2014-11-21 121 views
1

所以我是新的使用多個表。在今天之前,有一張桌子適合我的需求(我也可以在這裏使用1)。SQL多個表插入

我正在爲我玩的遊戲創建一個插件,但我正在使用MySQL數據庫來存儲所有信息。我有3張牌桌,球員,戰士和警告。警告中有2個外鍵(一個引用玩家,另一個引用Warner)。

此刻我需要做3個查詢。將這些信息添加到玩家& Warners中,然後發送給Warns。有沒有辦法可以減少查詢的數量,如果我只是省略前兩個查詢會發生什麼?

查詢示例:

INSERT INTO slimewarnsplayers VALUES ('123e4567-e89b-12d3-a456-426655440000', 'Spedwards'); 

INSERT INTO slimewarnswarners VALUES ('f47ac10b-58cc-4372-a567-0e02b2c3d479', '_Sped'); 

INSERT INTO slimewarnswarns VALUES ('', '123e4567-e89b-12d3-a456-426655440000', 'f47ac10b-58cc-4372-a567-0e02b2c3d479', 'spamming', 'medium'); 

表:

CREATE TABLE IF NOT EXISTS SlimeWarnsPlayers (
    uuid VARCHAR(36) NOT NULL, 
    name VARCHAR(26) NOT NULL, 
    PRIMARY KEY (uuid) 
); 

CREATE TABLE IF NOT EXISTS SlimeWarnsWarners (
    uuid VARCHAR(36) NOT NULL, 
    name VARCHAR(26) NOT NULL, 
    PRIMARY KEY (uuid) 
); 

CREATE TABLE IF NOT EXISTS SlimeWarnsWarns (
    id INT NOT NULL AUTO_INCREMENT, 
    pUUID VARCHAR(36) NOT NULL, 
    wUUID VARCHAR(36) NOT NULL, 
    warning VARCHAR(60) NOT NULL, 
    level VARCHAR(60) NOT NULL, 
    PRIMARY KEY (id), 
    FOREIGN KEY (pUUID) REFERENCES SlimeWarnsPlayers(uuid), 
    FOREIGN KEY (wUUID) REFERENCES SlimeWarnsWarners(uuid) 
); 

回答

3

有沒有一種方法,我可以減少查詢量?

不,我沒有看到。從您發佈的INSERT聲明(如下所示)中可以明顯看出,這些聲明是3個不同的表格,並且您將向其插入不同的數據。因此,您必須分別爲他們執行INSERT操作。

INSERT INTO slimewarnsplayers 

INSERT INTO slimewarnswarners 

INSERT INTO slimewarnswarns 

另一種選擇是(可能不被視爲好),創建將接受的數據和表名,並創建一個事先準備好的聲明/動態查詢來實現你說的話的過程。 (樣本僞代碼)

create procedure sp_insert(tablename varchar(10), data1 varchar(10), 
                data2 varchar(10)) 
as 
begin 
--dynamic query here 
INSERT INTO tablename VALUES (data1, data2); 
end 

爲了進一步解釋,您可以從應用程序端調用此過程來傳遞所需的數據。請注意,如果您與其他表具有外鍵關係,則必須從主表中捕獲last inserted key,然後將其傳遞給過程。

+0

這是兩個實體,一個關係(引用其他兩個插入),正確的外鍵,因此需要三個插入。 – 2014-11-21 14:10:26

+0

@ lx42.de,絕對正確。雖然使用動態查詢也是可能的(你將不得不從主表中捕獲最後插入的鍵值),但我不會去做;但值得一提。 – Rahul 2014-11-21 14:17:40

+0

我沒有抓住你的想法(好處),因爲你可以得到最新的插入ID而不是最後兩個(http://dev.mysql.com/doc/refman/5.0/en/information-functions.html #function_last-insert-id)你必須插入mem = LAST_INSERT_ID(),插入,插入(mem,LAST_INSERT_ID(),...),產生四個查詢。 – 2014-11-21 14:57:21