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

时间:2019-04-04 17:09:34

标签: sql database oracle copy constraints

我是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;

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

1 个答案:

答案 0 :(得分:1)

不,你不能那样做;您的第二条陈述(略有修正)将会得到

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 TABLE的{​​{1}}语句中定义外键约束,除非对该表进行了引用分区,并且该约束是表的分区引用约束。在所有其他情况下,您必须创建没有约束的表,然后稍后使用AS subquery语句添加表。

  •   

可以提供其他约束,例如在评论中链接到的@Jeff,因此您可以添加主键:

ALTER TABLE

或(只要约束名称唯一)

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;