我想更新一个MySQL数据库模式(使用MySQL代码),但遗憾的是我不确定表的状态,因为它们是分布式的。
假设我有些'客户'有一个名为“user”的表,其格式为
'name' VARCHAR(64) NOT NULL
'password' VARCHAR(64) NOT NULL
我想添加一个“电子邮件”列,但他们可能已经有一个电子邮件列(取决于他们的安装版本)。
如何运行命令以确保存在“电子邮件”列并且如果已经存在则不执行任何操作?请记住,对于许多更复杂的表格,我会这样做。
我知道我可以创建临时表并重新填充(并且如果它是唯一的解决方案),但我认为可能存在某种CREATE或UPDATE表命令,“你已经拥有该列,跳过”逻辑。
答案 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。
希望它有所帮助,
何塞路易斯