创建表的副本并在创建时为其提供约束
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 TABLE
的AS 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中的每个元素提供一定数量的副本