所以我不习惯使用多个表。在今天之前,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)
);
答案 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?)