如果 MYSQL 中存在表和列,则更改表

问题描述 投票:0回答:1

我有一个函数,我正在检查表和列是否存在。如果退出,那么我需要更改表。

    delimiter $$

create function column_exists(ptable varchar(300), pcolumn varchar(100))
  returns CHAR
  reads sql data
begin
  declare result CHAR(1);
  select
    if(count(1)>=1,'Y','N')
  into
    result
  from
    information_schema.columns
  where
    table_schema = 'schema' and
    table_name  = ptable and
    column_name = pcolumn ;
  return result;
end $$

但是我在使用该函数时遇到错误:

SET @column_exists := column_exists('table_name', 'column_name');

IF @column_exists = 'Y' THEN
    ALTER TABLE table_name MODIFY COLUMN column_name TIMESTAMP(3) DEFAULT '2019-01-01 00:00:00' NOT NULL;
ELSE
    SELECT 'Column does not exist';
END IF;

错误:

SQL Error [1064] [42000]: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF @column_exists = 'Y' THEN
    ALTER TABLE table_name MODIFY COLUMN column_na' at line 3

Error position: line: 2

请指导解决问题。谢谢。

sql mysql dbeaver
1个回答
0
投票

MySQL 不直接支持在存储过程、函数或查询之外使用 IF 语句。 您必须将其包含在存储过程中:

delimiter $$
create procedure column_(IN aux varchar(1), ptable varchar(300), pcolumn varchar(100))
begin

    IF (aux = 'Y') THEN
        SET @sql_query = CONCAT('ALTER TABLE ', ptable, ' MODIFY COLUMN ', pcolumn, ' TIMESTAMP(3) DEFAULT ''2019-01-01 00:00:00'' NOT NULL');
        PREPARE stmt FROM @sql_query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    ELSE
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Column does not exist';
    END IF;
end $$

并这样称呼它:

SET @column_exists := column_exists('table_name', 'column_name');

call column_(@column_exists, 'table_name', 'column_name');
© www.soinside.com 2019 - 2024. All rights reserved.