一尘不染

将列添加到mysql表(如果不存在)

mysql

我的研究和实验还没有得到答案,所以我希望能有所帮助。

我正在修改一个应用程序的安装文件,该应用程序在以前的版本中没有我想立即添加的列。我不想手动添加列,而是要在安装文件中并且仅在表中不存在新列的情况下才添加。

该表如下创建:

CREATE TABLE IF NOT EXISTS `#__comm_subscribers` (
      `subscriber_id` int(11) NOT NULL auto_increment,
      `user_id` int(11) NOT NULL default '0',
      `subscriber_name` varchar(64) NOT NULL default '',
      `subscriber_surname` varchar(64) NOT NULL default '',
      `subscriber_email` varchar(64) NOT NULL default '',
      `confirmed` tinyint(1) NOT NULL default '0',
      `subscribe_date` datetime NOT NULL default '0000-00-00 00:00:00',
      PRIMARY KEY  (`subscriber_id`),
      UNIQUE KEY `subscriber_email` (`subscriber_email`)
    ) ENGINE=MyISAM CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' COMMENT='Subscribers for Comm are stored here.';

如果我在create table语句下面添加以下内容,那么我不确定如果该列已经存在(可能已填充)会发生什么情况:

ALTER TABLE `#__comm_subscribers` ADD `subscriber_surname`;
ALTER TABLE `#__comm_subscribers` MODIFY `subscriber_surname` varchar(64) NOT NULL default '';

因此,我尝试了在某处找到的以下内容。这似乎不起作用,但是我不能完全确定我是否正确使用了它。

/*delimiter '//'
CREATE PROCEDURE addcol() BEGIN
IF NOT EXISTS(
SELECT * FROM information_schema.COLUMNS
WHERE COLUMN_NAME='subscriber_surname' AND TABLE_NAME='#__comm_subscribers'
)
THEN
    ALTER TABLE `#__comm_subscribers`
    ADD COLUMN `subscriber_surname` varchar(64) NOT NULL default '';
END IF;
END;
//
delimiter ';'
CALL addcol();
DROP PROCEDURE addcol;*/

有人有这样做的好方法吗?


阅读 332

收藏
2020-05-17

共1个答案

一尘不染

请注意,INFORMATION_SCHEMA5.0之前的MySQL不支持。5.0之前的版本也不支持存储过程,因此如果您需要支持MySQL
4.1,则此解决方案不是很好。

使用 数据库迁移
的框架使用的一种解决方案是在数据库中记录该模式的修订号。只是一个具有单列和单行的表,其中的整数表示当前有效的修订版本。更新架构时,请增加编号。

另一种解决方案是只 尝试ALTER TABLE ADD COLUMN命令。如果该列已存在,则应该抛出错误。

ERROR 1060 (42S21): Duplicate column name 'newcolumnname'

捕获错误并在升级脚本中忽略它。

2020-05-17