【问题标题】:ADD column if none exists in MySQL如果 MySQL 中不存在,则添加列
【发布时间】:2011-02-21 18:14:20
【问题描述】:
我认为这很容易,但我仅在这些列不存在时才尝试运行此命令:
ALTER TABLE `surveytable` ADD IF NOT EXISTS Survey_Name_Qualtrics VARCHAR(20);
ALTER TABLE `surveytable` ADD IF NOT EXISTS Survey_URL_Qualtrics VARCHAR(600);
【问题讨论】:
标签:
mysql
sql
alter-table
【解决方案1】:
CREATE PROCEDURE addcol() BEGIN
IF NOT EXISTS(
SELECT * FROM information_schema.COLUMNS
WHERE COLUMN_NAME='new_column' AND TABLE_NAME='the_table' AND TABLE_SCHEMA='the_schema'
)
THEN
ALTER TABLE `the_schema`.`the_table`
ADD COLUMN `new_column` bigint(20) unsigned NOT NULL default 1;
END IF;
END;
delimiter ';'
CALL addcol();
DROP PROCEDURE addcol;
这是我使用的代码,如果 ALTER 列上不存在,我认为您不能使用。
如果您尝试插入一个已经存在的列,您可以观察得到的错误,我认为它是 1062。并处理错误。
当然更好的方法是一开始就不要出错。
【讨论】:
-
如果您要复制其他论坛的答案,唯一的权利是添加link to it。当其他人链接到 SO 答案时,我也希望这样做。
【解决方案3】:
对此的另一个直接查询是告诉 MySQL 忽略查询期间出现的任何问题。
ALTER IGNORE TABLE `surveytable` ADD COLUMN Survey_Name_Qualtrics VARCHAR(20);
【解决方案4】:
diagnonalbatman 的回答对我不起作用; MySQL 5.7 在我尝试时会抱怨语法错误。它可能适用于早期版本的 MySQL,但评论毕竟已经超过 8 年了。
经过反复试验,我最终得到了这样的结果:
DELIMITER //
DROP PROCEDURE IF EXISTS addColumn //
CREATE PROCEDURE addColumn()
BEGIN
IF NOT EXISTS (
SELECT *
FROM information_schema.COLUMNS
WHERE COLUMN_NAME = 'column_name'
AND TABLE_NAME = 'table_name'
AND TABLE_SCHEMA = DATABASE()
) THEN
ALTER TABLE `table_name`
ADD COLUMN `column_name` bigint(20) UNSIGNED NOT NULL DEFAULT 1;
END IF;
END //
DELIMITER ;
CALL addColumn;
DROP PROCEDURE addColumn;