2010-02-26 3 views
3

У меня есть одна квартира MAIN_TABLE. Мне нужно вставить записи из этой таблицы в несколько TABLES.Вставка одной записи за раз в несколько таблиц из таблицы

например.

MAIN_TABLE 
col1, col2, col3, col4, col5 

PARENT1_TABLE 
PT1_ID(PK), col1,col2 

PARENT2_TABLE 
PT2_ID(PK), col3,col4 

PARENT2_CHILD_TABLE 
P2C_ID(PK), PT2_ID(FK), col5, col6 

и т.п.

Целью является то, что я должен перенести запись с этой квартиры MAIN_TABLE на реляционную структурированную, определенную выше.

Любая помощь будет высоко оценена?

Спасибо

+1

Вы это помечено как как Oracle, SQL-сервера и MySQL , вам нужно поддерживать все платформы с тем же решением? –

+0

что мешает вам запустить «вставить в ... select ...» 4 раза? – Martin

ответ

2

Если бы это было в SQL Server можно создать представление вашей MAIN_TABLE, а затем написать INSTEAD OF INSERT триггер на представлении. Таким образом, как вы делаете запись в своем MAIN_TABLE, ваш триггер может проанализировать его в ваших дочерних таблицах. Link goodness.

+0

MAIN_TABLE уже имеет данные. Мне нужно переместить эти данные в таблицы реляционной структуры – niceApp

+2

Ничего себе, никогда не слышал о «ВМЕСТЕ ТРИГГЕРА». Какой отличный способ сбить с толку сотрудников! – MusiGenesis

+0

Вы можете создать прокси-таблицу с той же схемой, создать представление и триггер поверх этого, а затем использовать BCP cmd с объемной вставкой. Вот некоторые другие варианты: http://www.databasejournal.com/features/mssql/article.php/3507171/Transferring-Data-from-One-Table-to-Another.htm – davecoulter

7

В Oracle вы можете сделать Multi-Table inserts. Создать фиктивный таблицу

create global temporary table err_dump 
    (ORA_ERR_NUMBER$ NUMBER, 
    ORA_ERR_MESG$  VARCHAR2(2000), 
    ORA_ERR_ROWID$ UROWID(4000), 
    ORA_ERR_OPTYP$ VARCHAR2(2), 
    ORA_ERR_TAG$  VARCHAR2(2000)); 

протоколирования ошибок Затем добавить уникальный ключ на (col1, col2) для Parent1 и (COL3, COL4) для parent2. Используйте вкладку с несколькими таблицами для загрузки в две родительские таблицы. Предложение LOG ERRORS INTO будет означать, что любые дубликаты, входящие в родительские таблицы, будут выбиты.

INSERT ALL 
     INTO parent1_table (pt1_id, col1,col2) 
     VALUES (rn, col1,col2) 
     LOG ERRORS INTO err_dump REJECT LIMIT 99999999 
     INTO parent2_table (pt2_id, col3, col4) 
     VALUES (rn, col3, col4) 
     LOG ERRORS INTO err_dump REJECT LIMIT 99999999 
    SELECT rownum rn, col1, col2, col3, col4 
    FROM MAIN_TABLE; 

Наконец, сделать выбор из MAIN, присоединился к parent1_table и parent2_table, чтобы получить новые первичные ключи, и что это простая вставка в PARENT2_CHILD_TABLE

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