Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обновление данных из 2-й таблицы / 9 сообщений из 9, страница 1 из 1
13.05.2003, 07:02
    #32158088
Dmitriy Pascal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных из 2-й таблицы
Есть 2 таблицы, table1 и table2. Структура полей этих таблиц идентичны.
Table1 рабочая таблица базы, имеет ограничения целостности и связана с другими таблицами БД. Table2 является созданной временно таблицей без индексов, связей и т.д.
table2 является обновлением для table1 и данные в table1 нужно заменить на table2. Самое простое решение это удалить все записи из table1 и добавить все из table2. Но это не дает сделать ограничения целостности и связи.
Как правильно перегнать данные из table2 в table1 путем замены старого на новое и удаление лишних записей из table1?
Помогите.
...
Рейтинг: 0 / 0
13.05.2003, 09:07
    #32158128
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных из 2-й таблицы
"Но это не дает сделать ограничения целостности и связи."

Связь - это имеется ввиду FOREIGN KEY? Тогда это тоже ограничение целостности.

А почему бы раз навсегда не написать скрипт, типа:
1) alter table table1 disable primary key cascade
2) alter table table1 disable constraint <имя> cascade -- столько команд сколько ограничений
3) truncate table table1
4) insert into table1 select * from table2
5) alter table table1 enable primary key
6) alter table table1 enable constraint <имя> -- столько команд сколько ограничений
7) Поднять все внешние ключи других таблиц выключенные в п.п. 1,2.
...
Рейтинг: 0 / 0
13.05.2003, 09:22
    #32158144
Dmitriy Pascal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных из 2-й таблицы
Спасибо!
Все замечательно, но мне таким способом нужно обновить до 50 таблиц.
Интересно вот эту строчку:
alter table table1 disable constraint <имя> cascade -- столько команд сколько ограничений
можно ли заменить только одной, что бы за раз снять все ограничение, можно же как то получить список ограничений?
...
Рейтинг: 0 / 0
13.05.2003, 09:27
    #32158152
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных из 2-й таблицы
Странный вы человек, сначала пишете "Есть 2 таблицы, table1 и table2", когда вам дают решение, вы говорите "но мне таким способом нужно обновить до 50 таблиц.".

А что нельзя было сразу написать - "У меня есть 50 таблиц,в которые нужно перегнать данные из других 50 таблиц."

Нравится играть в кошки-мышки?
...
Рейтинг: 0 / 0
13.05.2003, 10:27
    #32158230
Alex_M
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных из 2-й таблицы
Версия Oracle какая?
...
Рейтинг: 0 / 0
13.05.2003, 10:36
    #32158243
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных из 2-й таблицы
Если операция переноса данных периодически поворяется, то можно попробовать пересоздать ограничения с опцией DEFERRABLE. Для FOREIGN KEY это особого труда не составит, для PRIMARY и UUNIQUE KEY потребуется изменить используемый индекс на неуникальный. Тогда отключение/включение ограничений будет производится одной командой:
Код: plaintext
1.
2.
set constraints all deferred;
set constraints all immediate;

Минусов несколько:
- единожды придется пересоздать все ограничения.
- весь перенос данных придется осуществлять в одной транзакции.
- если при COMMIT'е будет обнаружено нарушение целостности - вся транзакция автомитически откатится.

Впрочем, если ты осилишь написание скрипта на пересоздание всех ограничений- использовать его же для disable/enable этих же ограничений не составит труда;)
...
Рейтинг: 0 / 0
13.05.2003, 10:57
    #32158277
Dmitriy Pascal
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных из 2-й таблицы
softbuilder@inbox.ru, спасибо за ответ, видимо это то что мне нужно, если не будет дополнений. И все таки возможно ли как нибудь получить список ограничений для таблицы что бы не корректировать и не прописывать все это для всех 50 таблиц?
Alex_M, 9.2.0 под Linux RH7.2, на самом деле нужно перегонять таблицы из парадокса. Все это дело сильно тормозит.
Denis Popov, минусов много. Кстати если расматривать пример softbuilder при
alter table table1 enable constraint <имя> и нарушенной целостности что произойдет?
...
Рейтинг: 0 / 0
13.05.2003, 11:22
    #32158315
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных из 2-й таблицы
Это тебе дорога на чтение Concept'а: "DDL statements implicitly commit the preceding and start a new transaction." http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96524/c16sqlpl.htm#478

А отключить ограничения целостности в самом простом варианте:
Код: plaintext
1.
2.
3.
select 'alter table '||table_name||' disable constraint '||constraint_name||';' code
from user_constraints 
where constraint_type = 'R';

выполнив получившийся результат как скрипт. Можно оформить все это в виде одного скрипта, процедуры и т.д., по желанию.
...
Рейтинг: 0 / 0
13.05.2003, 17:27
    #32158862
Alex_M
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обновление данных из 2-й таблицы
В 9-ке появилась команда merge позволяющая проводить update/insert в одной операции, т.е. для существующих записей будет update, а для новых insert. Пример:

merge into table_old o
using (select id, code, name from table_new) n
on (o.id=n.id)
when matched then update set o.code=n.code, o.name=n.name
when not matched then insert (o.id, o.code, o.name)
values (n.id, n.code, n.name)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обновление данных из 2-й таблицы / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]