TIDB对表增加字段或者索引,如何判断已经存在就不增加

原来是用mysql的时候使用的存储过程,增加字段或者索引是在shell脚本中添加,语法是:
IF NOT EXISTS(SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=’$IADB’ AND TABLE_NAME=‘t_xxx_receipt’ AND COLUMN_NAME=‘price_pay’) THEN
ALTER TABLE t_xxx_receipt ADD price_pay INT UNSIGNED after usd_amount;
END IF;

由于TiDB不支持存储过程不支持这样的语法,如何在sql中判断如果字段或者索引已经有了就不增加字段或者索引呢?重复添加TiDB会报错的或者重复添加时不让TiDB报错?

TiDB中元数据表与MySQL是兼容的,字段信息可以查information_schema.COLUMNS,索引信息可以查information_schema.STATISTICS,或者information_schema.TIDB_INDEXES。所以要想ADD COLUMN/INDEX不报错,那就先去元数据表里面查一下,没有了再ADD

好的,那就是要自己写个实现一个shell函数添加索引或者字段

SQL中判断不太行,上面的判断逻辑建议在应用中改写

嗯,能支持最好,不能支持只能自己外层实现一个类型的功能函数了

我们目前的处理方式有两种:
一、用公司平台脚本执行工具时,工具内部只打印错误,并继续执行,不会终止。
二、自己用查询分析器执行时,一般会使用报错继续执行的方式执行。

不用那麽麻煩,直接加 if not exists 不就好了

TiDB [test] 15:04:01> alter table t1 add column if not exists c2 int;
Query OK, 0 rows affected, 1 warning (0.001 sec)

Note (Code 1060): Duplicate column name 'c2'

TiDB [test] 15:05:10> create index if not exists idx_t1_c2 on t1(c2);
Query OK, 0 rows affected (2.890 sec)

TiDB [test] 15:05:25> create index if not exists idx_t1_c2 on t1(c2);
Query OK, 0 rows affected, 1 warning (0.002 sec)

Note (Code 1061): index already exist idx_t1_c2
1 个赞

:+1::+1::+1:原来字段和索引也可以用啊,我们只在创建表的时候用了一下