更新MySQL数据库表模式

时间:2015-04-27 18:21:41

标签: mysql database

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

假设我有些'客户'有一个名为“user”的表,其格式为

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

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

如何运行命令以确保存在“电子邮件”列并且如果已经存在则不执行任何操作?请记住,对于许多更复杂的表格,我会这样做。

我知道我可以创建临时表并重新填充(并且如果它是唯一的解决方案),但我认为可能存在某种CREATE或UPDATE表命令,“你已经拥有该列,跳过”逻辑。

2 个答案:

答案 0 :(得分:4)

您可以尝试这样:

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

答案 1 :(得分:1)

如果该列已经存在,ALTER TABLE ADD COLUMN语句将抛出错误,因此如果您认为由于尝试添加已存在但不会出现这种情况的列而可能会丢失数据,如果你需要处理错误。见flatMap

还有资源告诉您如何使用商店程序等处理这些问题。请参阅add column to mysql table if it does not exist

希望它有所帮助,

何塞路易斯