我想更新 MySQL 数据库架构(使用 MySQL 代码),但不幸的是我不确定表的状态,因为它们是分布式的。
假设一些“客户”有一个名为“用户”的表,其架构类似于
name VARCHAR(64) NOT NULL
password VARCHAR(64) NOT NULL
Run Code Online (Sandbox Code Playgroud)
我想添加一个email列,但他们可能已经有一个电子邮件列(取决于他们的安装版本)。
我怎样才能运行一个命令来确保有一个email列并且如果它已经在那里什么都不做?请记住,我会对许多更复杂的表执行此操作。
我知道我可以创建临时表并重新填充(如果它是唯一的解决方案,也会重新填充)但我认为可能有某种CREATE或UPDATEtable 命令具有“哦,您已经拥有该列,跳过”逻辑。
小智 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)
| 归档时间: |
|
| 查看次数: |
4354 次 |
| 最近记录: |