更新 MySQL 数据库表架构

tdo*_*iii 5 mysql database

我想更新 MySQL 数据库架构(使用 MySQL 代码),但不幸的是我不确定表的状态,因为它们是分布式的。

假设一些“客户”有一个名为“用户”的表,其架构类似于

name VARCHAR(64) NOT NULL
password VARCHAR(64) NOT NULL
Run Code Online (Sandbox Code Playgroud)

我想添加一个email列,但他们可能已经有一个电子邮件列(取决于他们的安装版本)。

我怎样才能运行一个命令来确保有一个email列并且如果它已经在那里什么都不做?请记住,我会对许多更复杂的表执行此操作。

我知道我可以创建临时表并重新填充(如果它是唯一的解决方案,也会重新填充)但我认为可能有某种CREATEUPDATEtable 命令具有“哦,您已经拥有该列,跳过”逻辑。

小智 5

你可以这样试试:

DELIMITER $$
CREATE PROCEDURE Alter_MyTable()
BEGIN
    DECLARE _count INT;
    SET _count = (  SELECT COUNT(*) 
                    FROM INFORMATION_SCHEMA.COLUMNS
                    WHERE   TABLE_NAME = 'user' AND 
                            COLUMN_NAME = 'email');
    IF _count = 0 THEN
        ALTER TABLE user
            ADD COLUMN email varchar(512);
    END IF;
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

或者更确切地说,使它成为一个通用的存储过程,如下所示:

create procedure AddColumnIfDoesntExists(
    IN dbName tinytext,
    IN tableName tinytext,
    IN fieldName tinytext,
    IN fieldDef text)
begin
    IF NOT EXISTS (
        SELECT * FROM information_schema.COLUMNS
        WHERE column_name=fieldName
        and table_name=tableName
        and table_schema=dbName
        )
    THEN
        set @ddl=CONCAT('ALTER TABLE ',dbName,'.',tableName,
            ' ADD COLUMN ',fieldName,' ',fieldDef);
        prepare stmt from @ddl;
        execute stmt;
    END IF;
end;
//

delimiter ';'
Run Code Online (Sandbox Code Playgroud)

  • @tdoakiiii:- 使用通用存储过程更新了我的答案。现在您需要通过提供表名和列名来调用这个存储过程。希望有帮助:) (2认同)
  • @tdoakiiii:- 将其称为`call AddColumnIfDoesntExists(Database(), 'user', 'email', 'varchar(100) null');` (2认同)