当前位置: 首页 > 面试题库 >

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

唐腾
2023-03-14
问题内容

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

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

该表如下创建:

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;*/

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


问题答案:

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

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

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

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

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



 类似资料:
  • 问题内容: 我看了很多例子。但是此查询不起作用,出现以下错误: 错误1064(42000):您的SQL语法有错误;在第1行的’IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =’)附近,查看与您的MySQL服务器版本相对应的手册以使用正确的语法。 问题答案: 您可以为查询创建一个过程,

  • 问题内容: 在我的数据库创建脚本中,创建脚本如下所示: 第一次运行良好,但是如果我再次运行,它将在最后一行失败,并带有“写入或更新时复制密钥”。 有什么办法可以做类似的事情吗?就像我可以使用查询吗? 问题答案: 有趣的问题。您可能需要在调用语句之前禁用外键,然后再启用它们。这将允许您直接在DDL中定义外键: 例: 测试用例:

  • 问题内容: 我正在使用SQL Server 2005/2008。我需要向表中添加一列(如果尚不存在)。这将应用于给定数据库中的所有表。我希望我能早一点,但与此解决方案有关。 如何才能做到这一点? 这是我所拥有的: 但是我得到了错误: 错误102:“ @ tblname”附近的语法不正确。’CreatedOn’附近的语法不正确。“ @tblname”附近的语法不正确。’CreatedOn’附近的语法

  • 我在做一件简单的事情,想不出该怎么做。我有一个使用方法的ArrayList,我想立即将结果添加到一个新的ArrayList中。 所以我想做类似的操作,但这不是正确的方法。 对我的代码的任何其他部分的PS建议也会很感激。谢谢!

  • 问题很简单。如何将列添加到表中,但仅当列不存在时?我在这里只找到了如何检查列是否存在的解决方案。

  • 问题内容: 我使用SQLAlchemy制作了一个表,却忘记添加列。我基本上想这样做: 这是什么语法?我在文档中找不到它。 问题答案: 这称为数据库迁移(SQLAlchemy不支持即开即用的迁移)。您可以考虑使用sqlalchemy- migrate 在这种情况下提供帮助,也可以仅通过选择的数据库的命令行实用程序,