|
|
|
Обновление данных из 2-й таблицы
|
|||
|---|---|---|---|
|
#18+
Есть 2 таблицы, table1 и table2. Структура полей этих таблиц идентичны. Table1 рабочая таблица базы, имеет ограничения целостности и связана с другими таблицами БД. Table2 является созданной временно таблицей без индексов, связей и т.д. table2 является обновлением для table1 и данные в table1 нужно заменить на table2. Самое простое решение это удалить все записи из table1 и добавить все из table2. Но это не дает сделать ограничения целостности и связи. Как правильно перегнать данные из table2 в table1 путем замены старого на новое и удаление лишних записей из table1? Помогите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2003, 07:02 |
|
||
|
Обновление данных из 2-й таблицы
|
|||
|---|---|---|---|
|
#18+
"Но это не дает сделать ограничения целостности и связи." Связь - это имеется ввиду 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2003, 09:07 |
|
||
|
Обновление данных из 2-й таблицы
|
|||
|---|---|---|---|
|
#18+
Спасибо! Все замечательно, но мне таким способом нужно обновить до 50 таблиц. Интересно вот эту строчку: alter table table1 disable constraint <имя> cascade -- столько команд сколько ограничений можно ли заменить только одной, что бы за раз снять все ограничение, можно же как то получить список ограничений? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2003, 09:22 |
|
||
|
Обновление данных из 2-й таблицы
|
|||
|---|---|---|---|
|
#18+
Странный вы человек, сначала пишете "Есть 2 таблицы, table1 и table2", когда вам дают решение, вы говорите "но мне таким способом нужно обновить до 50 таблиц.". А что нельзя было сразу написать - "У меня есть 50 таблиц,в которые нужно перегнать данные из других 50 таблиц." Нравится играть в кошки-мышки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2003, 09:27 |
|
||
|
Обновление данных из 2-й таблицы
|
|||
|---|---|---|---|
|
#18+
Версия Oracle какая? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2003, 10:27 |
|
||
|
Обновление данных из 2-й таблицы
|
|||
|---|---|---|---|
|
#18+
Если операция переноса данных периодически поворяется, то можно попробовать пересоздать ограничения с опцией DEFERRABLE. Для FOREIGN KEY это особого труда не составит, для PRIMARY и UUNIQUE KEY потребуется изменить используемый индекс на неуникальный. Тогда отключение/включение ограничений будет производится одной командой: Код: plaintext 1. 2. Минусов несколько: - единожды придется пересоздать все ограничения. - весь перенос данных придется осуществлять в одной транзакции. - если при COMMIT'е будет обнаружено нарушение целостности - вся транзакция автомитически откатится. Впрочем, если ты осилишь написание скрипта на пересоздание всех ограничений- использовать его же для disable/enable этих же ограничений не составит труда;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2003, 10:36 |
|
||
|
Обновление данных из 2-й таблицы
|
|||
|---|---|---|---|
|
#18+
softbuilder@inbox.ru, спасибо за ответ, видимо это то что мне нужно, если не будет дополнений. И все таки возможно ли как нибудь получить список ограничений для таблицы что бы не корректировать и не прописывать все это для всех 50 таблиц? Alex_M, 9.2.0 под Linux RH7.2, на самом деле нужно перегонять таблицы из парадокса. Все это дело сильно тормозит. Denis Popov, минусов много. Кстати если расматривать пример softbuilder при alter table table1 enable constraint <имя> и нарушенной целостности что произойдет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2003, 10:57 |
|
||
|
Обновление данных из 2-й таблицы
|
|||
|---|---|---|---|
|
#18+
Это тебе дорога на чтение 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. выполнив получившийся результат как скрипт. Можно оформить все это в виде одного скрипта, процедуры и т.д., по желанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2003, 11:22 |
|
||
|
Обновление данных из 2-й таблицы
|
|||
|---|---|---|---|
|
#18+
В 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2003, 17:27 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32158088&tid=1990607]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
65ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 343ms |

| 0 / 0 |
