MySQL:如果不存在,如何创建列?


14

我试图只为我的表创建一个列,如果它不存在。我进行了很多研究,但找不到任何解决方案。

真的有条件地创建Column吗?


我很好奇...如果该列已存在,仅让alter on error出错怎么办?
德里克·唐尼

实际上,我需要向客户端提供.sql文件,该文件将具有与数据库结构更改相关的所有查询。我无法发送整个数据库。我只想向他们发送数据库更改。该sql文件中还有更多查询。如果有关创建列的查询失败,则所有查询将失败。所以这就是为什么我要使用if条件创建列的原因。
zzzzz

如果数据库支持,则可以使用触发器。插入之前。
cybernard

Answers:


8

MySQL ALTER TABLE没有IF EXISTS规范。

如果您需要定期执行此操作,则可以使用存储的proc或编程语言来执行以下操作:

伪代码:

  • 使用以下SQL查找列是否存在:

    SELECT column_name FROM INFORMATION_SCHEMACOLUMNS WHERE TABLE_SCHEMA= [数据库名称] AND TABLE_NAME= [表名称];

  • 如果上述查询返回结果,则表明该列存在,否则,您可以继续创建该列。


在MySQL / MariaDB中,使用该查询时出现错误,指出该错误column_name不存在。我将查询重新表述为:SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' and column_name='[Column_name]';
耶稣阿隆索·阿巴德'18

2
对于MySQL和(我认为)MariaDB的简单0或1答案:SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='[Schema_name]' AND TABLE_NAME='[Table_name]' AND column_name='[Column_name]'
piojo,

14

实际上对于Maria DB 10.219现在存在

ALTER TABLE test ADD COLUMN IF NOT EXISTS column_a VARCHAR(255);

奖金,它也适用于修改

ALTER TABLE test MODIFY IF EXISTS column_a VARCHAR(255);

3
>“ MYSQL 5.5.5”?这是不正确的,这仅是Maria DB功能。
神剑

1
感谢您的更正
Paroofkey

6

您可以使用已经在另一StackOverFlow帖子中提到的解决方案:(参考:https//stackoverflow.com/a/31989541/

MySQL-ALTER TABLE添加一列(如果不存在):

SET @dbname = DATABASE();
SET @tablename = "tableName";
SET @columnname = "colName";
SET @preparedStatement = (SELECT IF(
  (
    SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS
    WHERE
      (table_name = @tablename)
      AND (table_schema = @dbname)
      AND (column_name = @columnname)
  ) > 0,
  "SELECT 1",
  CONCAT("ALTER TABLE ", @tablename, " ADD ", @columnname, " INT(11);")
));
PREPARE alterIfNotExists FROM @preparedStatement;
EXECUTE alterIfNotExists;
DEALLOCATE PREPARE alterIfNotExists;

2

下面为我​​工作:

    SELECT count(*)
    INTO @exist
    FROM information_schema.columns
    WHERE table_schema = 'mydatabase'
    and COLUMN_NAME = 'mycolumn'
    AND table_name = 'mytable' LIMIT 1;

    set @query = IF(@exist <= 0, 'ALTER TABLE mydatabase.`mytable`  ADD COLUMN `mycolumn` MEDIUMTEXT NULL',
    'select \'Column Exists\' status');

    prepare stmt from @query;

    EXECUTE stmt;

我去了这个,谢谢。
Stuart McIntyre,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.