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 创建的主要内容,如果未能解决你的问题,请参考以下文章