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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/21801869/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 20:04:01  来源:igfitidea点击:

MySQL: IF table exists, truncate and insert ELSE create

mysql

提问by John C

Working only with MySQL (I have essentially noPHP knowledge), I need to have a table that's essentially a subset from a much larger table. The source table changes from time to time, losing some entries, gaining other new ones, and values changing for existing ones. I can describe what I want to happen, but can't seem to figure out a syntax of commands to make it work. I also know I can have two separate queries and just run whichever one I need, and I have that worked out, but I'd like to combine them if possible. Here's what I want:

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

IF the subset_table DOES NOT EXIST, create it as [select query], ELSE truncate the subset_table and insert [select query]

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

Like I said, I know there are other ways to do this - I could drop if exists/create, or I could just have two different sql files to run. I just want to know if I can do this as specified above.

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

Thoughts?

想法?

回答by Gordon Linoff

You can do this:

你可以这样做:

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

truncate table <tablename>;

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

You don't need any ifstatements at all.

你根本不需要任何if陈述。

回答by Jeffery Allan

This can also be done through an SP (stored procedure)... makes it more readable and safe

这也可以通过 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`;

There is also another way,

还有一种方式,

  • You could pass the table names as arguments to the SP, in this case sub_table_name and main_table_name
  • Make the above DML statements to a string using CONCAT()
  • Create a prepared statement out of it and execute
  • 您可以将表名作为参数传递给 SP,在本例中为 sub_table_name 和 main_table_name
  • 使用 CONCAT() 将上述 DML 语句转换为字符串
  • 从中创建一个准备好的语句并执行

Hope this helped....

希望这有帮助....