Oracle的CTAS能不能将约束等属性带到新表?

news/2024/11/17 10:45:41/

今天看到一道题,提到的这些功能属性都很熟悉,但直接这么问,确实有些含糊,实践是检验真理的唯一标准,只能通过实验,来证明我们的猜测了,

4d2f1edede7c8eb06f45cceb883eec12.png

翻译一下问题,我们要验证的是,一张表上的主键、唯一约束、NOT NULL约束、外键约束,当在Oracle中通过CTAS创建一张新表的时候会不会复制过来?

创建测试表,

CREATE TABLE t1(id NUMBER PRIMARY KEY, c1 varchar2(1) NOT NULL, c2 NUMBER, c3 NUMBER UNIQUE);
CREATE TABLE t2(id NUMBER PRIMARY KEY, c1 varchar2(1) NOT NULL);
ALTER TABLE t1 ADD CONSTRAINT fk_t1_t2 FOREIGN KEY (c2) REFERENCES t2(id);

id是主键列,c1存在NOT NULL约束,c2存在外键约束,c3存在唯一约束,这里发现个DBeaver数据库客户端的显示问题,表的约束、外键视图中,都未显示c2这个外键约束,

b1a9884f6f165c855d26dd8641ca219f.png

但通过视图user_constraints,是可以找到创建的这个外键约束,

SQL> exec print_table('select constraint_name, constraint_type from user_constraints where table_name=''T1''');
CONSTRAINT_NAME               : FK_T1_T2
CONSTRAINT_TYPE               : R
-----------------
CONSTRAINT_NAME               : SYS_C007441
CONSTRAINT_TYPE               : C
-----------------
CONSTRAINT_NAME               : SYS_C007442
CONSTRAINT_TYPE               : P
-----------------
CONSTRAINT_NAME               : SYS_C007443
CONSTRAINT_TYPE               : U
-----------------PL/SQL procedure successfully completed.

CTAS创建表,

CREATE TABLE t1_1 AS SELECT * FROM t1;

可以看到,新的表只存在这个非空约束,主键、唯一约束、外键约束这几个,都没带过来,

SQL> exec print_table('select constraint_name, constraint_type, search_condition from user_constraints where table_name=''T1_1''');
CONSTRAINT_NAME               : SYS_C007445
CONSTRAINT_TYPE               : C
SEARCH_CONDITION              : "C1" IS NOT NULL
-----------------PL/SQL procedure successfully completed.

因此,答案显而易见了。

但是,为什么是这现象?我们从Oracle官方手册,能看到一些端倪,《SQL Language Reference》谈到了CTAS对于约束的复制能力,除了上述实验中涉及到的约束类型,其他一些不能复制过来的属性,都在此进行说明,

https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_7002.htm#sthref5328

Oracle Database derives data types and lengths from the subquery. Oracle Database follows the following rules for integrity constraints and other column and table attributes:

> Oracle Database automatically defines on columns in the new table any NOT NULL constraints that have a state of NOT DEFERRABLE and VALIDATE, and were explicitly created on the corresponding columns of the selected table if the subquery selects the column rather than an expression containing the column. If any rows vio‍late the constraint, then the database does not create the table and returns an error.

显式的NOT NULL约束自动会带到新表。

> NOT NULL constraints that were implicitly created by Oracle Database on columns of the selected table (for example, for primary keys) are not carried over to the new table.

隐式的NOT NULL约束不会带到新表,例如主键。

> In addition, primary keys, unique keys, foreign keys, check constraints, partitioning criteria, indexes, and column default values are not carried over to the new table.

另外,主键,唯一,外键,check约束,分区,索引以及列的默认值不会带到新表。

> If the selected table is partitioned, then you can choose whether the new table will be partitioned the same way, partitioned differently, or not partitioned. Partitioning is not carried over to the new table. Specify any desired partitioning as part of the CREATE TABLE statement before the AS subquery clause.

在新表上可以选择是否像旧表那样分区,或者不同的分区形式,或者创建非分区表。在AS subquery句之前指定。

> A column that is encrypted using Transparent Data Encryption in the selected table will not be encrypted in the new table unless you define the column in the new table as encrypted at create time.

TDE的列不会带到新表。

因此,像约束这种这么普通的属性,都会有这些隐藏的现象,数据库的技术领域还真是深奥,而这可能也是技术的迷人之处,碰到问题、探究问题、解决问题,乐此不疲。


近期更新的文章:

《故障树分析法(FTA)》

《"红警"游戏开源代码带给我们的震撼》

《中国四大航天发射场》

《最近碰到的一些问题》

《MySQL设置管理员密码无法生效的案例一则》

文章分类和索引:

《公众号1000篇文章分类和索引》


http://www.ppmy.cn/news/402983.html

相关文章

故障树分析法(FTA)

当我们碰到一个技术问题,探究其根源的方法可能有很多,故障树分析法(Fault Tree Analysis,简称FTA)就是其中之一,其实不仅是技术问题,其他领域,甚至是生活中的很多问题,都可以用这个方法来进行处…

再次了解max_allowed_packet

MySQL的参数很多,当出现问题时,往往就是某个参数在作祟,一方面说明MySQL的控制灵活,另一方面就要求熟知常用的参数作用,才能在出现问题的时候快速定位。 曾经写过一篇《小白学习MySQL - max_allowed_packet》的文章&am…

翻译专业资格(水平)考试介绍

关于英语考试,无论是国际的,还是国内的,都有很多种,之前介绍过TOEIC《我们征服托业,还是被托业征服?》,国内比较专业的英语考试,全国翻译专业资格考试(CATTI)算是一个,他…

TiDB沙箱环境初体验

最近接触了国产数据库领域中很火的TiDB数据库,先不说技术层面,给我印象最深的,就是他的培训和文档支持体系,非常系统和全面,这和传统巨头Oracle的服务支持路径很像。 培训课程,由浅入深,适合不同…

Oracle同英超联赛数据统计和展示的结合

技术是为业务服务的,一直在各个领域被论证,毕竟有场景使用,才能体现出价值,否则只能自娱自乐了。 了解现代足球篮球联赛的朋友,可能知道,现在球场上产生的数据是相当多的,无论是从维度上&#x…

MySQL客户端对配置文件读取顺序的问题场景

我们都知道使用MySQL客户端来访问MySQL数据库时,会以一定的顺序读取不同位置的配置文件,但在一次做测试时,发现除了按照顺序读取默认的配置文件路径外,MySQL还有额外的读取配置文件的行为。如下是爱可生开源技术社区最近推送的一篇…

魔方的征途 - 魔方如何选择?

可能大多和我同岁的朋友,小时候都有一个"我们认为一定能复原"但实际"无法复原"的魔方,看着大神们"信手拈来"的复原过程,除了惊呼"这个不可能"外,好像没其他能做的了,有些凄凉…

Oracle 21c对JSON支持功能增强

在这篇文章中《Oracle和JSON的结合》介绍了Oracle对JSON的支持,有朋友提了两个问题, 问题1,Oracle有没有字段可以直接存储JSON串并支持检索的? 问题2,试过几次,用来读取和约束还行,但是要用来存…