MySQL:如果存在,则重命名表

25

这个 DROP TABLE IF EXISTS 可以正常工作,但很遗憾 RENAME TABLE IF EXISTS 不起作用。

有人能提供这个查询的解决方案吗?

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF EXISTS video_top_day TO video_top_day_for_delete' at line 1

查询:

RENAME TABLE IF EXISTS video_top_day TO video_top_day_for_delete

你是不是忘记发布查询了? - Schiavini
涉及哪个版本的Mysql服务器?错误信息/代码是什么? - rkosegi
@rkosegi,要避免出现错误,需要涉及哪个版本的mysql? IF EXISTS在mysql重命名语法中不存在。 - John
9个回答

35

我已经成功执行了一段代码,当表不存在时不会产生任何错误:

SELECT Count(*)
INTO @exists
FROM information_schema.tables 
WHERE table_schema = [DATABASE_NAME]
    AND table_type = 'BASE TABLE'
    AND table_name = 'video_top_day';

SET @query = If(@exists>0,
    'RENAME TABLE video_top_day TO video_top_day_for_delete',
    'SELECT \'nothing to rename\' status');

PREPARE stmt FROM @query;

EXECUTE stmt;

当你不想手动替换[DATABASE NAME]时,可以使用以下变量

SELECT DATABASE() INTO @db_name FROM DUAL;

1
我会采用类似的方法。+1 - rkosegi
1
更改了答案所有者。 - Somebody
工作得很好,不过我建议您也检查一下重命名的表是否已存在。这将使函数成为幂等函数。 - MSC

14

首先创建表IF NOT EXISTS。然后对其进行RENAME,这样它就会一直存在!

否则,请重命名表,并在不存在时处理错误。

很明显,但它是有效的。


我不会使用IF NOT EXISTS。 :D 伙计,你就像显而易见的队长。 - Somebody
我会在链中创建另一个查询,以检查是否存在这样的表。但处理错误也可以。嗯,也许比检查更好的方法是跳过到下一个链序列。 - Somebody

12

目前还没有官方解决方案。在2004年曾经提交了一个功能请求,但从未关闭


谢谢,伙计。所以我想在重命名 SHOW TABLES LIKE 'video_top_day' 之前必须执行另一个查询。我很快会接受你的答案。 - Somebody

5

在您的问题八年后,MariaDB在版本10.5.2中添加了您想要的确切语法:https://mariadb.com/kb/en/rename-table/

IF EXISTS
从MariaDB 10.5.2开始
如果使用此指令,则在重命名的表不存在时,将不会出现错误。


2
又是MariaDB在Oracle疏忽大意之后接手的又一个案例。 - Pikamander2

2
create table table2 like table1;
insert into table2 select * from table1;
drop table table1;

1
这并不能解决问题。如果table1不存在怎么办?而且,你只是为了改变表名而复制整个表! - vulkanino
CREATE TABLE更改为CREATE TABLE IF NOT EXISTS,你就有一个公平的解决方案。 - Marcus Adams
@MarcusAdams 不,你还没有。这不会解决table1可能不存在的问题。此外,这也不会复制触发器或外键。 - x3ro

1
如果您不想保留变量,也可以这样做:
DELIMITER $$
IF EXISTS (SELECT *
                     FROM INFORMATION_SCHEMA.TABLES
                     WHERE TABLE_SCHEMA = database()
                     AND  TABLE_NAME = 'oldname')
THEN
    RENAME TABLE oldname to newname;
END if;
$$
DELIMITER ;

你甚至可以创建一个函数以便重复使用它。

0

一种解决方法:

CREATE TABLE IF NOT EXISTS video_top_day;
RENAME TABLE video_top_day TO video_top_day_for_delete

如果不存在,它会创建一个空表!


0
DELIMITER ;;
DROP PROCEDURE IF EXISTS renameTableIfExists;;
CREATE PROCEDURE renameTableIfExists(IN tbl VARCHAR(255), IN toTbl VARCHAR(255))
BEGIN
SELECT DATABASE() INTO @db_name;
SELECT Count(*) INTO @exists FROM information_schema.tables 
  WHERE table_schema = @db_name
    AND table_type = 'BASE TABLE'
    AND TABLE_NAME = tbl;

IF @exists > 0 THEN
   SET @dropToTbl = CONCAT("DROP TABLE IF EXISTS ", toTbl); PREPARE dropToTbl FROM @dropToTbl; EXECUTE dropToTbl;
   SET @renameTbl = CONCAT("RENAME TABLE ", tbl, " to ",  toTbl); PREPARE renameTbl FROM @renameTbl; EXECUTE renameTbl;
   SELECT @tbl, @toTbl;
ELSE   
   SELECT 'Table not exists';
END IF;
END;;
DELIMITER ;

CALL renameTableIfExists('Tags', 'Tags2');

0

如果您熟悉PL/SQL,则可以通过查询information_schema.columns来检查表的存在性,并基于此执行重命名操作。


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