如果列不存在,则无法添加?

Posted

技术标签:

【中文标题】如果列不存在,则无法添加?【英文标题】:Not able to add a column if it doesn't already exist? 【发布时间】:2015-08-17 10:27:08 【问题描述】:

我正在尝试编写一个查询以在 mysql 表中添加一个列,如果它不存在,如下所示,但我收到一个语法错误:

SQL 错误 (1064):您的 SQL 语法有错误;

查看与您的 MySQL 服务器版本相对应的手册,以了解在 'IF NOT EXISTS(SELECT NULL 附近使用的正确语法 FROM INFORMATION_SCHEMA.COLUMNS WHE' 在第 1 行。

查询:

 IF NOT EXISTS(SELECT NULL 
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE  table_name = 'Devicebattery'
        AND table_schema = 'mat'
        AND column_name = 'WrittenToServerDatabaseTimestamp')  
THEN
  ALTER TABLE 'Devicebattery' ADD 'WrittenToServerDatabaseTimestamp'
    TIMESTAMP(3) NOT NULL DEFAULT '1970-01-01 00:00:01.000';
END IF;

表格详情如下:-

CREATE TABLE Devicebattery (
    DeviceBatteryID INT(11) NOT NULL AUTO_INCREMENT,
    ByDevSessionId INT(11) NOT NULL,
    ByPatientId INT(11) NULL DEFAULT NULL,
    ByDeviceId INT(11) NULL DEFAULT NULL,
    Value FLOAT NULL DEFAULT NULL,
    SequenceId INT(11) NULL DEFAULT NULL,
    SyncStatus INT(11) NULL DEFAULT '0',
    Timestamp TIMESTAMP(3) NULL DEFAULT NULL,
    PRIMARY KEY (DeviceBatteryID),
    INDEX `ByDevSessionId` (ByDevSessionId),
    CONSTRAINT Devicebattery_ibfk_1 FOREIGN KEY (ByDevSessionId)
     REFERENCES devicesession (DeviceSessionID) ON UPDATE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=524994
;

【问题讨论】:

你不能简单地编造句法。请参阅手册。 if then else 只能用于存储的函数/过程和触发器。 而且在任何情况下,如果列不存在,您都不会明智地构建它。 【参考方案1】:

在 MYSQL 中,IF ELSE 逻辑应该是存储过程或用户定义函数的一部分。如果您要动态添加列,则应将此作为存储过程

Create procedure add_column
as
Begin
IF NOT EXISTS(SELECT NULL 
        FROM INFORMATION_SCHEMA.COLUMNS
        WHERE  table_name = 'Devicebattery'
        AND table_schema = 'mat'
        AND column_name = 'WrittenToServerDatabaseTimestamp')  
THEN
  ALTER TABLE 'Devicebattery' ADD 'WrittenToServerDatabaseTimestamp' 
  TIMESTAMP(3) NOT NULL DEFAULT '1970-01-01 00:00:01.000';
END IF;
end

【讨论】:

【参考方案2】:

试一试:

DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
  DECLARE _count INT;
  SET _count = (SELECT NULL 
         FROM INFORMATION_SCHEMA.COLUMNS
         WHERE  table_name = 'Devicebattery'
         AND table_schema = 'mat'
         AND column_name = 'WrittenToServerDatabaseTimestamp');
  IF _count = 0 THEN
    ALTER TABLE Devicebattery
        ADD COLUMN 'WrittenToServerDatabaseTimestamp' 
        TIMESTAMP(3) NOT NULL DEFAULT '1970-01-01 00:00:01.000';
  END IF;
END $$
DELIMITER ;

您也可以尝试@Madhivanan 的解决方案,如果我了解您的需求,那么这两个程序都应该有效。

【讨论】:

以上是关于如果列不存在,则无法添加?的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server中判断表列不存在则创建的方法[转]

SharePoint REST:列不存在错误

错误:关系列不存在 PostgreSQL,无法运行插入查询

添加列作为外键会给出外键约束中引用的 ERROR 列不存在

Django 迁移错误:列不存在

如果 PostgreSQL 上不存在,如何添加列?