如果该列存在,如何使用ALTER将其删除到MySQL表中?
我知道我可以使用ALTER TABLE my_table DROP COLUMN my_column
,但是如果my_column
不存在则会抛出错误。是否有其他语法可有条件地删除列?
我正在使用MySQL版本4.0.18。
如果该列存在,如何使用ALTER将其删除到MySQL表中?
我知道我可以使用ALTER TABLE my_table DROP COLUMN my_column
,但是如果my_column
不存在则会抛出错误。是否有其他语法可有条件地删除列?
我正在使用MySQL版本4.0.18。
Answers:
对于MySQL,没有: MySQL Feature Request。
无论如何,允许这样做是一个非常糟糕的主意:IF EXISTS
表明您正在(具有)未知结构的数据库上运行破坏性操作。在某些情况下,这对于速干的本地工作是可以接受的,但是如果您想针对生产数据运行这样的语句(在迁移等过程中),那么您将大受打击。
但是,如果您坚持认为,则不难先在客户端中先检查是否存在,或捕获错误。
MariaDB还从10.0.2开始支持以下内容:
DROP [COLUMN] [IF EXISTS] col_name
即
ALTER TABLE my_table DROP IF EXISTS my_column;
但是,仅依靠MySQL的几个分支之一支持的非标准功能可能是一个坏主意。
MySQL中对此没有语言级别的支持。这是一个涉及5.0+版本中MySQL information_schema元数据的解决方法,但在4.0.18版本中无法解决您的问题。
drop procedure if exists schema_change;
delimiter ';;'
create procedure schema_change() begin
/* delete columns if they exist */
if exists (select * from information_schema.columns where table_schema = schema() and table_name = 'table1' and column_name = 'column1') then
alter table table1 drop column `column1`;
end if;
if exists (select * from information_schema.columns where table_schema = schema() and table_name = 'table1' and column_name = 'column2') then
alter table table1 drop column `column2`;
end if;
/* add columns */
alter table table1 add column `column1` varchar(255) NULL;
alter table table1 add column `column2` varchar(255) NULL;
end;;
delimiter ';'
call schema_change();
drop procedure if exists schema_change;
我在博客文章中写了一些更详细的信息。
我知道这是一个旧线程,但是有一种无需使用存储过程即可处理此要求的简单方法。这可能会帮助某人。
set @exist_Check := (
select count(*) from information_schema.columns
where TABLE_NAME='YOUR_TABLE'
and COLUMN_NAME='YOUR_COLUMN'
and TABLE_SCHEMA=database()
) ;
set @sqlstmt := if(@exist_Check>0,'alter table YOUR_TABLE drop column YOUR_COLUMN', 'select ''''') ;
prepare stmt from @sqlstmt ;
execute stmt ;
希望这对某人有帮助,就像我所做的那样(经过大量的试验和错误)。
我刚刚建立了一个可重用的过程,可以帮助使DROP COLUMN
幂等:
-- column_exists:
DROP FUNCTION IF EXISTS column_exists;
DELIMITER $$
CREATE FUNCTION column_exists(
tname VARCHAR(64),
cname VARCHAR(64)
)
RETURNS BOOLEAN
READS SQL DATA
BEGIN
RETURN 0 < (SELECT COUNT(*)
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = SCHEMA()
AND `TABLE_NAME` = tname
AND `COLUMN_NAME` = cname);
END $$
DELIMITER ;
-- drop_column_if_exists:
DROP PROCEDURE IF EXISTS drop_column_if_exists;
DELIMITER $$
CREATE PROCEDURE drop_column_if_exists(
tname VARCHAR(64),
cname VARCHAR(64)
)
BEGIN
IF column_exists(tname, cname)
THEN
SET @drop_column_if_exists = CONCAT('ALTER TABLE `', tname, '` DROP COLUMN `', cname, '`');
PREPARE drop_query FROM @drop_column_if_exists;
EXECUTE drop_query;
END IF;
END $$
DELIMITER ;
用法:
CALL drop_column_if_exists('my_table', 'my_column');
例:
SELECT column_exists('my_table', 'my_column'); -- 1
CALL drop_column_if_exists('my_table', 'my_column'); -- success
SELECT column_exists('my_table', 'my_column'); -- 0
CALL drop_column_if_exists('my_table', 'my_column'); -- success
SELECT column_exists('my_table', 'my_column'); -- 0
IF EXISTS (SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TableName' AND COLUMN_NAME = 'ColumnName'
AND TABLE_SCHEMA = SchemaName)
BEGIN
ALTER TABLE TableName DROP COLUMN ColumnName;
END;
我知道这个线程现在已经很旧了,但是我遇到了同样的问题。这是我使用MySQL Workbench的最基本的解决方案,但效果很好。
x
DROP a
;现在具有该表的所有表都没有该表的任何表,它们将在日志中显示错误
那么您可以查找/替换'drop a
'并将其更改为'ADD COLUMN b
INT NULL'等,然后再次运行整个过程...。
有点笨拙,但是最后您得到了最终结果,您可以控制/监视整个过程,并记得保存您的sql脚本,以防万一您再次需要它们。