暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

人大金仓数据库KingbaseES KES中的EXISTS选项的使用及说明

原创 数据猿 2023-12-19
1823


关键字:、人大金仓、KingbaseES、exists

概述

在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为例:

  1. 在KES中,当使用ALTER TABLE语句更改表属性时,如果不使用IF EXISTS选项,则:若要更改的表已经存在,则对表属性进行相应的修改;若表不存在,则系统报错。当使用IF EXISTS选项时,则:若要更改的表已经存在,则对表属性进行相应的修改;若表不存在,则系统不会执行任何操作并返回一个NOTICE。
  2. 在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选项可以减少报错,防止操作中断。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论