【问题标题】:Update MySQL database table schema更新 MySQL 数据库表模式
【发布时间】:2015-04-27 18:21:40
【问题描述】:

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

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

name VARCHAR(64) NOT NULL
password VARCHAR(64) NOT NULL

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

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

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

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    你可以这样试试:

    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 ;
    

    或者更确切地说,让它成为一个像这样的通用存储过程:

    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 ';'
    

    【讨论】:

    • 是否有一种实用的方法可以为每个表的每一列执行此操作,还是我需要单独执行此操作?
    • @tdoakiiii:- 用通用存储过程更新了我的答案。现在您需要通过提供表名和列名来调用此存储过程。希望有帮助:)
    • @tdoakiiii:- 像call AddColumnIfDoesntExists(Database(), 'user', 'email', 'varchar(100) null');这样称呼它
    • 太棒了,谢谢。如果该列已经存在,这不会产生错误吗?
    • 我在 'ADD COLUMN ',fieldName,' ',fieldDef) 行出现错误; #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 15 行的 '' 附近使用
    【解决方案2】:

    如果该列已经存在,ALTER TABLE ADD COLUMN 语句将抛出一个错误,所以如果您认为您可能会因为尝试添加一个已经存在的列而丢失数据,如果您需要的话,情况并非如此处理错误。见add column to mysql table if it does not exist

    还有资源告诉你如何用存储过程等处理这些。见MySQL add column if not exist

    希望对你有帮助。

    【讨论】:

    • 问题是我不知道是缺少一列还是缺少 5 列,我试图避免添加列的混乱。相反,我希望有一个神奇的“更新”过程,而不需要遍历每一列。这是我跳进去之前没有先见之明的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多