创建表的副本并在创建时为其提供约束

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建表的副本并在创建时为其提供约束相关的知识,希望对你有一定的参考价值。

我是Oracle数据库的新手。我知道我们可以使用CREATE TABLE copy_emp(eid, ename,job,mid,sal,dept_id) as SELECT employee_id, concat(first_name,last_name),job_id,manager_id,salary,department_id FROM employees;创建表的副本,稍后我们可以使用alter table copy_emp add constraint epk FORIEGN KEY(dept_id) references departments(dept_id)添加外键约束

但是在通过查询创建表副本时是否可以提供约束。

例如,我们可以这样做:

CREATE table copy_emp(eid, ename,job,mid,sal,dept_id constraint dpt_fk references copy_dept(department_id) ON DELETEcascade)
as
SELECT employee_id,
concat(first_name,last_name),job_id,manager_id,salary,department_id 
FROM employees;

如果是,那么我们是否可以在创建表副本时提供约束而不是查询,如果不是为什么?

答案

不,你做不到;你的第二个陈述(略微修正)会得到

ORA-02440: Create as select with referential constraints not allowed
02440. 00000 -  "Create as select with referential constraints not allowed"
*Cause:    create table foo (... ref. con. ...) as select ...;
*Action:   Create the table as select, then alter the table to add the
           constraints afterwards.

这是提到in the documentation

对表的定义查询的限制

表查询受以下限制:

  • 表中的列数必须等于子查询中的表达式数。
  • 列定义只能指定列名,默认值和完整性约束,而不能指定数据类型。
  • 您不能在包含CREATE TABLEAS subquery语句中定义外键约束,除非该表是引用分区且约束是表的分区引用约束。在所有其他情况下,您必须创建没有约束的表,然后使用ALTER TABLE语句添加它。

可以提供其他约束,如在注释中链接到@Jeff的答案,因此您可以添加主键:

CREATE table copy_emp(eid primary key, ename,job,mid,sal,dept_id)
as
SELECT employee_id,
concat(first_name,last_name),job_id,manager_id,salary,department_id 
FROM employees;

或(只要约束名称是唯一的)

CREATE table copy_emp(eid, ename,job,mid,sal,dept_id,
  constraint emp_pk primary key (eid))
as
SELECT employee_id,
concat(first_name,last_name),job_id,manager_id,salary,department_id 
FROM employees;

以上是关于创建表的副本并在创建时为其提供约束的主要内容,如果未能解决你的问题,请参考以下文章

在代码中创建这些约束,需要建议

如何在布尔属性为空时为其提供默认值

创建代理并为其人口提供不同的 ID/名称,并在不同的时间停止每个 ID 延迟

创建数组X,并在python中为数组Y中的每个元素提供一定数量的副本

从 QtProcess 运行 Linux 二进制文件时为其提供参数

需要帮助在按下精灵节点按钮时为其提供动画