我正在尝试将一列插入表中(如果该列尚不存在)。任何类似 DROP COLUMN IF EXISTS 的东西都不起作用(删除和添加列都不起作用),显然是因为我的 MySQL 版本不支持此类 if 条件。
我的问题是,是否可以根据 CASE
语句将列插入到表中?
我已经弄清楚如何确定列是否存在,但我正在努力根据此条件插入列。
我希望工作的case语句
看起来像这样:
CASE WHEN (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='PSIP-1.Standardproject_V2.5_notvalid'
AND TABLE_NAME='PS_Relevant Rail Stations$Loc'
AND COLUMN_NAME='triade')
IS NULL THEN
ALTER TABLE PS_Relevant Rail Stations$Loc
ADD COLUMN triade;
我也不确定该 CASE 语句
放在哪里,因为该代码本身无法运行。我是否需要从 UPDATE PS_Relevant Rail Stations$Loc
开始,然后继续 CASE
?
最佳答案
您可以使用存储过程来实现此功能,该存储过程将数据库名称、表名称、列名称和列定义作为输入,如果指定表中不存在列名称,则创建一个动态 SQL 语句来创建它。例如:
DELIMITER //
DROP PROCEDURE IF EXISTS add_column_if_not_exists //
CREATE PROCEDURE add_column_if_not_exists(IN dbname VARCHAR(50),
IN tblname VARCHAR(50),
IN colname VARCHAR(50),
IN coltype VARCHAR(50))
BEGIN
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA=dbname
AND TABLE_NAME=tblname
AND COLUMN_NAME=colname) THEN
SET @sql = CONCAT('ALTER TABLE `', dbname, '`.`', tblname, '` ADD COLUMN `', colname, '` ', coltype);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
END //
DELIMITER ;
然后您可以像这样调用此过程(根据需要修改列定义)
CALL add_column_if_not_exists('PSIP-1.Standardproject_V2.5_notvalid',
'PS_Relevant Rail Stations$Loc',
'triade',
'INT NOT NULL DEFAULT 0')
请注意,如果您只有特定情况,例如它始终是同一个表中的同一列,您可以在查询中对这些值进行硬编码并删除相应的输入参数。
关于mysql - 有条件地添加/删除列 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58992870/