mysql - 有条件地添加/删除列 MySQL

标签 mysql conditional-statements information-schema

我正在尝试将一列插入表中(如果该列尚不存在)。任何类似 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/

相关文章:

sql - 列出 postgresql information_schema 中的所有表

mysql - 在 MySQL 中仅显示用户创建的表?

java - hibernate 错误

c# - lambda 表达式中的语句和返回 lambda

MySQL group-by 与逗号分隔列表

java - 问题 : Java-Read socket (Bluetooth) input stream until a string (<! MSG>) 被读取

javascript - JavaScript 中的 if/if else 逻辑

mysql - 如何获取 MYSQL 数据库中表和 View 的 from 子句中使用的所有表和 View 的列表?

php - Zend 2 无法连接到数据库

Mysql使用总和到百分比