Создайте копию таблицы и предоставьте ей ограничения при создании - PullRequest
2 голосов
/ 04 апреля 2019

Я новичок в базе данных 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 Ответ

1 голос
/ 04 апреля 2019

Нет, вы не можете этого сделать; ваше второе утверждение (слегка исправленное) получит

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, который содержит 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...