MySQL添加列(如果不存在)

phi*_*530 29 mysql sql

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;
Run Code Online (Sandbox Code Playgroud)

我看了很多例子.但是这个查询不起作用,我得到的错误是:

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

小智 26

如果你的主机没有授予你创建或运行程序的权限,我想我找到了另一种使用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;
Run Code Online (Sandbox Code Playgroud)

  • 非常适合在_ad hoc_脚本中使用。 (2认同)

Joh*_*Woo 24

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

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 ;
Run Code Online (Sandbox Code Playgroud)

  • 脚本中存在逻辑错误,如果表不存在,则"Count"= 0也是如此.您需要首先检查表是否存在,然后检查列. (4认同)