概述
在KES中,很多command命令都支持使用EXISTS选项,其主要功能是判断当前系统中是否已经存在了同名的对象。
对于CREATE语句来说,EXISTS选项主要判断对象是否存在,如果对象存在,则不会继续执行CREATE操作并返回一个NOTICE,反之则继续执行创建对象的操作,常见的语法格式为:CREATE <对象类型> IF NOT EXISTS <对象名> … 。若不使用EXISTS选项,在表创建对象时,系统若发现该对象已存在,则会直接报错,而不是返回NOTICE。
对于ALTER和DROP语句来说,EXISTS选项主要判断对象是否不存在。如果对象不存在,则不会继续执行ALTER、DROP操作并返回一个NOTICE,反之则继续执行后续操作。常见的语法格式为:ALTER <对象类型> IF EXISTS <对象名> … 。若不使用EXISTS选项,在表修改对象属性或者删除对象时,系统若发现该对象不存在,则会直接报错,而不是返回NOTICE。
CREATE的IF NOT EXISTS选项
以CREATE TABLE为例,在KES中,当使用CREATE TABLE语句创建表时,如果不使用IF NOT EXISTS选项,则:若要创建的表已经存在,系统报错;若表不存在,则创建对应的表。当使用IF NOT EXISTS选项时,则:若要创建的表已存在,则系统不会执行任何操作并会返回一个NOTICE;若表不存在,则创建对应的表。
KES测试示例:
test=# select * from test;
ERROR: relation "test" does not exist
LINE 1: select * from test;
^
test=# create table if not exists test (i int);
CREATE TABLE
test=# create table if not exists test (i int);
NOTICE: relation "test" already exists, skipping
CREATE TABLE
test=# select * from test;
i
---
(0 rows)
test=# insert into test values (1);
INSERT 0 1
test=# create table if not exists test (i int);
NOTICE: relation "test" already exists, skipping
CREATE TABLE
test=# select * from test;
i
---
1
(1 row)
通过上述测试可以看出,对于KES来说,在使用CREATE语句的IF NOT EXISTS选项时,不管要创建的对象是否存在,都不会报错中断操作。如果当前系统中不存在同名表,则CREATE TABLE IF NOT EXISTS会创建一个表,否则,系统会返回一个NOTICE,并且不继续执行创建表操作。这可以从表中的信息中看出来,在表test中插入数据以后,使用CREATE TABLE IF NOT EXISTS test重新创建test表,此时系统并没有报错而是返回NOTICE。但是test并没有被重复创建,旧的test也没有被新的create语句更新,因为test中的表格内容并没有任何变化。如果不添加IF NOT EXISTS选项,则系统在创建同名表时会报错。
ALTER和DROP的IF EXISTS选项
以ALTER/DROP TABLE为例:
- 在KES中,当使用ALTER TABLE语句更改表属性时,如果不使用IF EXISTS选项,则:若要更改的表已经存在,则对表属性进行相应的修改;若表不存在,则系统报错。当使用IF EXISTS选项时,则:若要更改的表已经存在,则对表属性进行相应的修改;若表不存在,则系统不会执行任何操作并返回一个NOTICE。
- 在KES中,当使用DROP TABLE语句删除表时,如果不使用IF EXISTS选项,则:若要删除的表已经存在,则删除表;若表不存在,则系统报错。当使用IF EXISTS选项时,则:若要删除的表已经存在,则删除表;若表不存在,则系统不会执行任何操作并返回一个NOTICE。
测试示例:
test=# alter table if exists test rename to test1;
ALTER TABLE
test=# alter table if exists test rename to test1;
NOTICE: relation "test" does not exist, skipping
ALTER TABLE
test=# drop table if exists test;
NOTICE: table "test" does not exist, skipping
DROP TABLE
test=# drop table if exists test1;
DROP TABLE
如上所示,ALTER TABLE和DROP TABLE的IF EXISTS选项功能非常相似,都是检查当前表是否存在,如果存在,则修改表属性,或者删除表,如果不存在,则返回NOTICE。如果不添加IF EXISTS选项,则系统会报错。
dump功能
在KES中,dump导出的sql 文件中不会存在任何if not exists或者if exists语句,这是为了防止对当前数据库已经存在的内容产生影响。
和KES不同的是,在mysql中,Dump导出的sql文件里会存在IF EXISTS语句,其主要用于恢复表时先判断表是否存在,当表存在时,会先删除现有的表,并按照sql文件内容恢复一个新的表。但是表自己用if not exists创建的对象或者用if exists修改或删除的对象也不会体现在dump生成的sql文件中,即Dump生成的sql文件中的if exists语句和表行为无关,是系统预先设计好的规则。
例:
用create if not exists创建的表格t1,在Dump生成的sql文件中可以看出,创建表时并不包含if not exists 选项,而是先用DROP TABLE IF EXISTS语句当前删除可能存在的表t1,然后再创建新表。
相关的Dump生成的sql文件内容如下:
DROP TABLE IF EXISTS `t1`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `t1` (
`i` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
总结
在KES中,EXISTS选项是一个非常重要而且有用的选项,他可以提高SQL语句的健壮性。
如果单独使用某一句SQL语句,EXISTS选项看起来可能没那么重要,因为对表来说,单独的SQL语句不管返回ERROR还是NOTICE都没有什么区别。但是在使用脚本等自动化输入SQL语句的情况下,添加EXISTS选项可以减少报错,防止操作中断。




