MySQL:如果表存在,则截断并插入;否则创建。

14

我只使用MySQL(基本上没有PHP知识),需要有一个表格,它基本上是从一个更大的表格中选择的子集。源表不时地发生变化,失去一些条目,获得其他新条目,并且现有条目的值也会改变。我可以描述我想要发生的事情,但好像无法找出命令语法来使其工作。我也知道我可以有两个单独的查询,只需运行我需要的那个,我已经解决了这个问题,但如果可能的话,我想将它们结合起来。这是我想要的:

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

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

您有什么想法?

2个回答

21

你可以这样做:

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

truncate table <tablename>;

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

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


我认为我喜欢这个 - 因此,在表的第一个实例上,它将创建-截断-插入,而每个后续时间它将只是截断-插入。很有道理! - John C

1
这也可以通过存储过程(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语句转换为字符串
  • 创建一个准备好的语句并执行

希望这有所帮助....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接