SQL多表插入

时间:2014-11-21 14:00:20

标签: mysql sql sql-insert

所以我不习惯使用多个表。在今天之前,1个表适合我的需求(我可能也可以在这里使用1)。

我正在为我玩的游戏创建一个插件,但我正在使用MySQL数据库来存储所有信息。我有3张桌子,玩家,华纳和警告。 Warns有2个外键(一个参考玩家,另一个参考华纳)。

目前我需要做3个查询。将信息添加到Players&华纳,然后警告。有没有办法可以减少查询量,如果我只是省略前2个查询会发生什么?

查询示例:

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)
);

2 个答案:

答案 0 :(得分: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,然后将其传递给过程。

答案 1 :(得分:2)

不,您无法在一个MySQL命令中插入多个表。但是,您可以使用交易。

BEGIN;
INSERT INTO slimewarnsplayers VALUES(.....);
 last_id = LAST_INSERT_ID()
INSERT INTO SlimeWarnsWarners VALUES(last_id, ....);
INSERT INTO SlimeWarnsWarns VALUES(last_id, ....);
COMMIT;

我还要看一下http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

和这篇文章MySQL Insert into multiple tables? (Database normalization?)