2013-05-17 2 views
0

У меня есть скопированная таблица:Oracle SQL ОР-02291 родительский ключ не найден

CREATE TABLE d_clients_copy As SELECT * FROM d_clients; 

только структура данных и значения копируются, ограничение нет.

Так я добавляю первичный ключ к вновь созданной базе данных:

ALTER TABLE d_clients_copy 
add CONSTRAINT client_number_pk 
    PRIMARY KEY (client_number); 

Теперь у меня есть столбец первичного ключа во вновь созданную таблицу.

У меня есть таблица с событиями, и я пытаюсь ссылаться на client_number из таблицы c_clients_copy.

ALTER TABLE d_events_copy 
add CONSTRAINT client_number_fk 
    FOREIGN KEY (client_number) 
    REFERENCES d_clients_copy (client_number); 

И оракул дает следующее сообщение об ошибке:

ORA-02298: cannot validate ... - parent keys not found.

Какой является родителем? Я так растерялся.

Примечание: каждая таблица содержит данные.

+1

Параметр 'client_number' столбец' d_events_copy' таблица содержит те значения, отсутствующие в 'client_number' колонке' d_clients_copy' Таблица. Вот почему эта ошибка. – Noel

+0

@Noel Таблица 'd_events_copy' была создана с использованием' SELECT * FROM d_clients' без предложения where, поэтому я думаю, что есть те же данные. – Parado

+0

Я не знаю, какие данные есть в таблицах. Но ошибка, безусловно, связана с дочерней таблицей, имеющей данные, отсутствующие в родительской таблице. Пусть OP проверяет данные. 'select client_number из d_events_copy, где client_number не входит (выберите client_number из d_clients_copy)' – Noel

ответ

2

Когда вы скопировали две таблицы, у вас могут быть изменения, происходящие между моментом, когда были выбраны выборки.

По умолчанию второй выбор не будет выбирать данные в то же время, что и первый выбор, поскольку уровень изоляции запросов по умолчанию для Oracle - READ COMMITTED.

Чтобы изменить это поведение, вы должны изменить уровень изоляции запроса для сеанса в SERIALIZABLE: http://docs.oracle.com/cd/B28359_01/server.111/b28318/consist.htm#CNCPT1320

Смежные вопросы