【问题标题】:SQL Multiple Tables InsertionSQL 多表插入
【发布时间】:2014-11-21 14:00:19
【问题描述】:

所以我不熟悉使用多个表。在今天之前,1 张桌子适合我的需要(我可能也可以在这里使用 1 张桌子)。

我正在为我玩的游戏创建一个插件,但我正在使用 MySQL 数据库来存储所有信息。我有 3 张桌子,Players、Warners 和 Warns。 Warns 中有 2 个外键(一个引用 Players,另一个引用 Warners)。

目前我需要做 3 个查询。将信息添加到 Players & Warners,然后添加到 Warns。有没有办法可以减少查询量?如果我只省略前 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)
);

【问题讨论】:

    标签: mysql sql sql-insert


    【解决方案1】:

    有什么方法可以减少查询量吗?

    不,我没有看到。从您发布的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,然后将其传递给过程。

    【讨论】:

    • 即两个实体,一个关系(引用另外两个插入),正确的外键,所以需要三个插入。
    • @lx42.de,绝对正确。虽然也可以使用动态查询(您必须从主表中捕获最后插入的键值),但我不会这样做;但值得一提。
    • 我没有抓住(好处)你的想法,因为你可以获得最新的插入 id 而不是你必须插入的最后两个 (dev.mysql.com/doc/refman/5.0/en/…),mem=LAST_INSERT_ID(), insert , insert(mem, LAST_INSERT_ID(), ...) 导致四个查询。
    【解决方案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?)

    【讨论】:

      猜你喜欢
      • 2014-04-11
      • 2017-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多