MySQL:如果表存在,则截断并插入ELSE-create

MySQL:如果表存在,则截断并插入ELSE-create,mysql,Mysql,仅仅使用MySQL,我基本上没有PHP知识,我需要一个表,它本质上是一个更大的表的子集。源表会不时更改,丢失一些条目,获得其他新条目,现有条目的值也会更改。我可以描述我想要发生的事情,但似乎无法找出命令的语法来让它工作。我也知道我可以有两个独立的查询,只运行我需要的任何一个,我已经解决了,但如果可能的话,我想将它们结合起来。以下是我想要的: 如果子集_表不存在,则将其创建为[select query],否则截断子集_表并插入[select query] 正如我所说,我知道还有其他方法可以做到这一

仅仅使用MySQL,我基本上没有PHP知识,我需要一个表,它本质上是一个更大的表的子集。源表会不时更改,丢失一些条目,获得其他新条目,现有条目的值也会更改。我可以描述我想要发生的事情,但似乎无法找出命令的语法来让它工作。我也知道我可以有两个独立的查询,只运行我需要的任何一个,我已经解决了,但如果可能的话,我想将它们结合起来。以下是我想要的:

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

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

想法?

您可以这样做:

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

truncate table <tablename>;

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

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

这也可以通过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语句转换为字符串 用它创建一个准备好的语句并执行
希望这有帮助……

我想我喜欢这样-因此,在表的第一个实例上,它将创建truncate insert,随后每次它都将创建truncate insert。有道理!