我正在尝试将列插入表中(如果尚未存在的话)。像DROP COLUMN IF EXISTS
之类的东西都不起作用(删除和添加列均不起作用),显然是因为我的MySQL版本不支持这种if条件。
我的问题是,是否可以根据CASE
语句在表中插入列?
我已经弄清楚了如何确定一列是否存在,但是我正在根据这种情况努力插入一列。
我想工作的case statement
看起来像这样:
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 statement
放在哪里,因为此代码本身无法运行。我需要从UPDATE PS_Relevant Rail Stations$Loc
开始,然后从CASE
继续吗?
答案 0 :(得分:1)
您可以使用存储过程实现此功能,该存储过程将输入数据库名称,表名称,列名称和列定义作为输入,如果指定表中不存在该列名称,则创建一个动态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')
请注意,如果您有特定情况,例如它始终在同一表中的同一列中,您只需在查询中对这些值进行硬编码并删除相应的输入参数即可。