MySQL:如果表存在,截断并插入 ELSE 创建

Posted

技术标签:

【中文标题】MySQL:如果表存在,截断并插入 ELSE 创建【英文标题】:MySQL: IF table exists, truncate and insert ELSE create 【发布时间】:2014-02-15 18:36:23 【问题描述】:

只使用 mysql(我基本上 没有 php 知识),我需要一个表,它本质上是一个更大表的子集。源表不时更改,丢失一些条目,获得其他新条目,并且现有条目的值发生变化。我可以描述我想要发生的事情,但似乎无法弄清楚使其工作的命令语法。我也知道我可以有两个单独的查询,只运行我需要的任何一个,我已经解决了,但如果可能的话,我想将它们组合起来。这就是我想要的:

如果subset_table 不存在,将其创建为[select query],否则截断subset_table 并插入[select query]

就像我说的,我知道还有其他方法可以做到这一点 - 如果存在/创建,我可以删除,或者我可以只运行两个不同的 sql 文件。我只是想知道我是否可以按照上面的说明进行操作。

想法?

【问题讨论】:

【参考方案1】:

你可以这样做:

create table if not exists <tablename> . . .;

truncate table <tablename>;

insert into <tablename>(cols)
    select blah blahblah . . .;

您根本不需要任何if 语句。

【讨论】:

我想我喜欢这个 - 所以,在表的第一个实例上,它会创建截断插入,并且每次它都会截断插入。有道理!【参考方案2】:

这也可以通过 SP(存储过程)来完成...使其更具可读性和安全性

DELIMITER $$

    DROP PROCEDURE IF EXISTS `create_table_sp`$$

    CREATE PROCEDURE `create_table_sp`()
    BEGIN

    IF NOT EXISTS (SELECT 1 FROM information_schema.TABLES WHERE table_name = '<table_name>'
    AND table_schema = DATABASE() AND table_type = 'BASE TABLE') THEN
        CREATE TABLE <subset_table_name>
        AS SELECT * FROM <main_table_name>;
    ELSE
        TRUNCATE TABLE <subset_table_name>;
        INSERT INTO <subset_table_name>
        AS SELECT * FROM <main_table_name>;
    END IF;

    END$$

    DELIMITER ;

    CALL `create_table_sp`;

DROP PROCEDURE IF EXISTS `create_table_sp`;

还有一种方法,

您可以将表名作为参数传递给 SP,在本例中为 sub_table_name 和 main_table_name 使用 CONCAT() 将上述 DML 语句转换为字符串 从中创建一个准备好的语句并执行

希望这有帮助....

【讨论】:

以上是关于MySQL:如果表存在,截断并插入 ELSE 创建的主要内容,如果未能解决你的问题,请参考以下文章

我的 Sql Bulk 插入加载数据并截断

MYSQL从另一个表更新数据,如果存在,否则插入[重复]

如果不存在,mysql插入不起作用创建重复键

MySQL 仅在表不存在时插入数据

如何在截断并保留 ID 列值后从临时表中重新插入记录

JAVA中,向MYSQL插入多条数据,如何判断如果某记录已经存在就不插入