Mysql - add a column to a table if not exists

迈不过友情╰ 2022-02-28 00:08 401阅读 0赞

在mysql中我们可以在create table之前判断这个table是不是已经存在,如果已经存在则不创建,从而避免报错。
但是mysql并没有提供原生的方法在添加一个列之前判断这个列是否已经存在。
在实际项目中,我们可能需要判断列是否存在,如果不存在则添加某列,比如在一个项目的初始化sql脚本中。

我们可以创建一个存储过程来实现,如下:

  1. drop procedure if exists AddColumnUnlessExists;
  2. create procedure AddColumnUnlessExists(
  3. IN dbName tinytext,
  4. IN tableName tinytext,
  5. IN fieldName tinytext,
  6. IN fieldDef text)
  7. begin
  8. IF NOT EXISTS (
  9. SELECT * FROM information_schema.COLUMNS
  10. WHERE column_name=fieldName
  11. and table_name=tableName
  12. and table_schema=dbName
  13. )
  14. THEN
  15. set @ddl=CONCAT('ALTER TABLE ',dbName,'.',tableName,
  16. ' ADD COLUMN ',fieldName,' ',fieldDef);
  17. prepare stmt from @ddl;
  18. execute stmt;
  19. END IF;
  20. end;

使用方法:

  1. call AddColumnUnlessExists(DATABASE(), 'test', 'name', 'varchar(50) NULL');
  2. call AddColumnUnlessExists('test', 'test', 'name2', 'varchar(50) NULL');
  3. -- 对一些特殊的字段名(如order)、数据库名或表名(如含有-_等特殊字符),使用你``引起来
  4. call AddColumnUnlessExists('`db-test`', '`t_test`', '`order`', 'varchar(50) NULL');

使用完后如果不再需要可删除:

  1. drop procedure AddColumnUnlessExists;

或者,更简单粗暴地,你可以在初始化数据库时直接忽略错误:

  1. <!-- 在初始化数据库时,遇到错误是否继续,默认false -->
  2. spring.datasource.continue-on-error=true

发表评论

表情:
评论列表 (有 0 条评论,401人围观)

还没有评论,来说两句吧...

相关阅读