【问题标题】:MySQL add column if not existMySQL 添加列,如果不存在
【发布时间】:2013-01-01 03:47:52
【问题描述】:
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = 'email_subscription' AND COLUMN_NAME = 'subscribe_all')
  THEN 
  ALTER TABLE email_subscription
  ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
  ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;

我查看了大量示例。但是这个查询不起作用,我得到了错误:

ERROR 1064 (42000):您的 SQL 语法有错误;检查 与您的 MySQL 服务器版本相对应的手册 'IF NOT EXISTS (SELECT * FROM) 附近使用的语法 INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =' 第 1 行

【问题讨论】:

标签: mysql sql


【解决方案1】:

您在 MySQL 中使用 MS SQL Server 语法。

【讨论】:

  • 哈!我知道有些事情不对劲,但我不能指望它:)
【解决方案2】:

您可以为查询创建一个过程,

DELIMITER $$
CREATE PROCEDURE Alter_Table()
BEGIN
    DECLARE _count INT;
    SET _count = (  SELECT COUNT(*) 
                    FROM INFORMATION_SCHEMA.COLUMNS
                    WHERE   TABLE_NAME = 'email_subscription' AND 
                            COLUMN_NAME = 'subscribe_all');
    IF _count = 0 THEN
        ALTER TABLE email_subscription
            ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
            ADD COLUMN subscribe_category varchar(512) DEFAULT NULL;
    END IF;
END $$
DELIMITER ;

【讨论】:

  • 脚本中存在逻辑错误,如果表不存在Count = 0 也。您需要先检查表是否存在,然后检查列。
  • @HamletHakobyan 我假设提供的表格存在。
  • 我知道了您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 '@count INT; 附近使用的正确语法
  • 嘿,太棒了,它现在通过了。我是否必须在某个地方调用此函数才能使其运行?
  • 实际上,它正在工作,我只需运行 call Alter_Table() 就可以了!谢谢!
【解决方案3】:

还为数据库名称添加条件以检查列是否存在。

试试这个:

DELIMITER $$
CREATE PROCEDURE sp_AlterTable()
BEGIN
    IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                   WHERE TABLE_SCHEMA = 'dbName' AND 
                         TABLE_NAME = 'email_subscription' AND 
                         COLUMN_NAME = 'subscribe_all') THEN 
       ALTER TABLE email_subscription
          ADD COLUMN subscribe_all TINYINT(1) DEFAULT 1,
          ADD COLUMN subscribe_category VARCHAR(512) DEFAULT NULL;
    END IF; 
END $$
DELIMITER ;

【讨论】:

    【解决方案4】:

    没有等效的语法可以在单个 MySQL 语句中实现这一点。

    要获得类似的东西,您可以

    1) 尝试使用 ALTER TABLE 添加列,如果该名称的列已存在于表中,则让 MySQL 引发错误,或者

    2) 查询 information_schema.columns 视图以检查表中是否存在该名称的列。

    请注意,您确实需要检查 table_schema 以及 table_name:

    SELECT column_name
      FROM information_schema.columns 
     WHERE table_schema = 'foo'
       AND table_name   = 'email_subscription'
       AND column_name  = 'subscribe_all'
    

    并据此决定是否运行 ALTER TABLE

    【讨论】:

      【解决方案5】:

      如果您的主机不允许您创建或运行程序,我想我找到了另一种使用 PREPARE/EXECUTE 和查询架构的方法:

      SET @s = (SELECT IF(
          (SELECT COUNT(*)
              FROM INFORMATION_SCHEMA.COLUMNS
              WHERE table_name = 'table_name'
              AND table_schema = DATABASE()
              AND column_name = 'col_name'
          ) > 0,
          "SELECT 1",
          "ALTER TABLE table_name ADD col_name VARCHAR(100)"
      ));
      
      PREPARE stmt FROM @s;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
      

      【讨论】:

      • 非常适合在 ad hoc 脚本中使用。
      【解决方案6】:
      SET @s = (SELECT IF(
          (SELECT COUNT(column_name)
                FROM INFORMATION_SCHEMA.COLUMNS
                WHERE table_name = 'oc_bitcoin_wallets_receive'
                AND table_schema = 'k_opencart2'
                AND column_name = 'test3'
          ) > 0,
          "SELECT 1",
          "ALTER TABLE `oc_bitcoin_wallets_receive` ADD COLUMN `test3` INT NOT NULL AFTER `test2`;"
      ));
      PREPARE stmt FROM @s;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
      

      编辑值: oc_bitcoin_wallets_receive - 表名, k_opencart2 - 数据库名称, test3 - 新列的名称, oc_bitcoin_wallets_receive - 第二个位置表 test3 - 第二个位置列, test2 - 新列之前的列名。

      【讨论】:

        猜你喜欢
        • 2011-03-15
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 2018-02-02
        • 2019-03-12
        相关资源
        最近更新 更多