我想更新一个MySQL数据库模式(使用MySQL代码),但是不幸的是我不确定表的状态,因为它们是分布式的。
假设某些“客户”有一个名为“ user”的表,其表格式如下
name VARCHAR(64) NOT NULL
password VARCHAR(64) NOT NULL
我想添加一email
列,但是可能他们已经有一个电子邮件列(取决于安装版本)。
如何运行确保有email
列的命令,如果已经存在则什么也不做?请记住,我将对许多更复杂的表执行此操作。
我知道我可以创建临时表并重新填充(和意愿,如果它是唯一的解决办法),但我想可能有某种CREATE
或UPDATE
table命令具有“哦,你已经有柱,跳过”逻辑。
您可以这样尝试:
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 ';'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句