使用CREATE TABLE AS SELECT语句创建表时会复制哪些约束?
CREATE TABLE AS SELECT(CTAS)复制约束的规则
使用CREATE TABLE AS SELECT(CTAS)创建新表时,绝大多数原表约束不会被自动复制,只有少数基础属性会继承,具体行为因数据库系统而异:
主流数据库的具体表现
MySQL/MariaDB:
- 仅会保留列的数据类型、长度,以及列的
NULL/NOT NULL属性(查询直接引用原表列时);如果原表列的默认值是常量,也会被复制。 - 主键、外键、唯一约束、检查约束、触发器、索引等都不会被复制。
- 仅会保留列的数据类型、长度,以及列的
PostgreSQL:
- 仅复制列的数据类型和
NOT NULL约束(查询直接选择原表列时)。 - 主键、外键、唯一约束、检查约束、默认值、索引、触发器等均不会自动继承,需要手动添加。
- 仅复制列的数据类型和
Oracle:
- 默认仅复制列的数据类型、
NOT NULL约束(直接引用原表列时),以及常量类型的列默认值。 - 主键、外键、唯一约束等不会自动复制;Oracle 12c及以上版本可以通过添加
INCLUDING CONSTRAINTS子句,复制除了外键之外的其他约束。
- 默认仅复制列的数据类型、
注意事项
如果需要完整保留原表的约束,更可靠的方式是:先手动创建包含所有所需约束的空表,再通过INSERT INTO ... SELECT语句将原表数据导入新表,而不是直接使用CTAS。
内容的提问来源于stack exchange,提问作者Harish Giri
相关产品推荐
相关产品推荐

