2014-11-21 47 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