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

DM(达梦)外部表介绍-不能存在任何约束条件测试

原创 tom-li 2022-07-05
2092

今天进行dcp考试,发现外部表创建总是失败,最后通过manager创建成功,下来分析一下发现视图中第一了外部表中列id    NULLABLE 是N(不允许为空),DM8 SQL语言使用手册中定义了外部表,其中一条就是5. 外部基表不能存在任何约束条件;因此我认为这道题不够严谨。需要修正。

3.6.1.2 定义外部表

需指定如下信息:

1. 表名、表所属的模式名;

2. 列定义;

3. 控制文件路径。

语法格式

CREATE EXTERNAL TABLE <表名定义> <表结构定义>;

<表名定义> ::=[<模式名>.]<表名>

<表结构定义> ::= (<列定义> {,<列定义>}) 子句>

<列定义> ::= <列名> <数据类型>

<列定义> 参见 3.6.1 节说明

> = 子句 1> | 2> | 子句 3>|

1> ::= FROM '<控制文件路径>'

2> ::= FROM DATAFILE '<数据文件路径>' [<数据文件参数列表>]

3> ::= FROM <控制文件目录> <控制文件选项>

4> ::= FROM DATAFILE <数据文件目录> <数据文件选项> [<数据文件参数列表>]

<数据文件参数列表> ::= PARMS(<参数选项> {,<参数选项>})

<参数选项> ::=

[FIELDS DELIMITED BY <表达式>] |

[RECORDS DELIMITED BY <表达式>]|

[ERRORS ]|

[BADFILE '<数据文件路径>']|

[LOG <日志文件路径>]|

[NULL_STR ]|

[SKIP <跳过行数>]|

[CHARACTER_CODE <文件字符集>]

<控制文件目录> ::= DEFAULT DIRECTORY <控制文件目录名>

<控制文件选项> ::= LOCATION ('<控制文件名>')

<数据文件目录> ::= DEFAULT DIRECTORY <数据文件目录名>

<数据文件选项> ::= LOCATION ('<数据文件名>')

参数

1. <模式名> 指明该表属于哪个模式,缺省为当前模式;

2. <表名> 指明被创建的外部基表名;

3. <列名> 指明基表中的列名;

4. <数据类型> 指明列的数据类型,暂不支持多媒体类型;

5. <控制文件路径> 指明使用的控制文件的路径的字符串;

6. <数据文件路径> 指明使用的数据文件路径的字符串;

7. <参数选项> FIELDS 表示列分隔符;RECORDS 表示行分隔符,缺省为回车;

ERRORS 表示忽略外部表数据转换中出现错误的行数,取值范围为大于 0 的正整数,缺省为

0,表示不忽略错误。LOG 表示日志文件路径,如果不指定则不会生产日志;NULL_STR 指

定数据文件中 NULL 值的表示字符串,默认忽略此参数;SKIP 指定跳过数据文件起始的逻

辑行数,默认为 0;CHARACTER_CODE 指定数据文件中数据的编码格式,默认为 GBK,可

选项有 GBK,UTF-8,SINGLE_BYTE 和 EUC-KR;

8. <表达式> 字符串或十六进制串类型表达式;

9. <控制文件目录名> 指数据库对象目录的名称。

==============使用说明======================

语句功能供 DBA 或具有 CREATE_TABLE 权限的用户定义外部基表。MPP 环境下不支持创建外部表。

使用说明:

1. <表名>指定了所要建立的外部基表名。如果<模式名>缺省,则缺省为当前模式。

表名需要是合法的标识符,且满足 SQL 语法要求;

2. 外部表的表名最大长度为 128 个字符;

3. 所建外部基表至少要包含一个<列名>指定的列,在一个外部基表中,各<列名>不

得相同。一张外部基表中至多可以包含 2048 列;

4. 外部基表不能存在大字段列;

5. 外部基表不能存在任何约束条件;

6. 外部基表不能为临时表,不能建立分区;

7. 外部基表上不能建立任何索引;

8. 外部基表是只读的,不存在表锁,不允许任何针对外部表的增删改数据操作,不允

许 TRUNCATE 外部表操作;

9. 控制文件路径,以及数据文件路径建议采用绝对路径;

10. 控制文件的书写格式为:

DCP考试中有一题是不是错误的,请大家一同分析一下:

因业务需要,请根据/opt/emp.txt文件,建立外部表DMTEST.EMP。(5分)
表结构如下:
序号 TABLE_NAME COLUMN_NAME DATA_TYPE NULLABLE COMMENTS
1 EMP ID INT N 编号
2 EMP SEX CHAR(4) Y 性别
3 EMP NAME VARCHAR(20) Y 姓名
4 EMP EMAIL VARCHAR(50) Y 邮箱
5 EMP TEL VARCHAR(15) Y 电话
SQL> create external table DMTEST.EMP(ID INT not null,SEX CHAR(4),NAME VARCHAR(20),EMAIL VARCHAR(50),TEL VARCHAR(15)) from '/opt/emp.ctl';
create external table DMTEST.EMP(ID INT not null,SEX CHAR(4),NAME VARCHAR(20),EMAIL VARCHAR(50),TEL VARCHAR(15)) from '/opt/emp.ctl';

第1 行附近出现错误[-2609]:外部表不支持的操作.

已用时间: 1.776(毫秒). 执行号:0.
通过图形界面manager工具获取到DDl语句如下:且执行成功
SQL> CREATE EXTERNAL TABLE "DMTEST"."EMP"("ID" INT,"SEX" CHAR(4),"NAME" VARCHAR(20),"EMAIL" VARCHAR(50),"TEL" VARCHAR(15)) FROM '/opt/emp.ctl';
操作已执行
已用时间: 34.950(毫秒). 执行号:301.

以上唯一不同的地方就是emp表中的id值是不是允许为null。题目要求是NULLABLE 是N,但是外部表不支持约束。因此没法设置其值不能为空

SQL> DESC DMTEST.EMP

行号 NAME TYPE$ NULLABLE
---------- ----- ----------- --------
1 ID INTEGER Y
2 SEX CHAR(4) Y
3 NAME VARCHAR(20) Y
4 EMAIL VARCHAR(50) Y
5 TEL VARCHAR(15) Y

已用时间: 5.647(毫秒). 执行号:312.
SQL>


其实手册中也定义了外部表外部基表不能存在任何约束条件。因此这个题是不是有问题?

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

评论