我是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;
如果是而不是查询,如果不是,为什么我们可以在创建表副本时提供约束?
答案 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.
对表的定义查询的限制
表查询受以下限制:
表中的列数必须等于子查询中的表达式数。
列定义只能指定列名称,默认值和完整性约束,而不能指定数据类型。
您不能在包含
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;