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

时间:2014-02-15 18:36:23

标签: mysql

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

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

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

思想?

2 个答案:

答案 0 :(得分:18)

你可以这样做:

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

truncate table <tablename>;

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

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

答案 1 :(得分:0)

这也可以通过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语句转换为字符串
  • 从中创建预备语句并执行

希望这有帮助......