Заполнение таблицы из SQL-скрипта

Архангельский Андрей

       Если заполнять обычную реляционную таблицу, то в соответствии с классической теорией РБД порядок вставки строк не имеет значения. Но древовидная структура добавляет информацию о положении строк в общей структуре. Следовательно, при вставке новой записи ее родитель уже должен существовать.
       Первый родитель, он же корень дерева, как было сказано выше — это запись с идентификатором равным "0". Таким образом оператор для вставки второй записи должен иметь вид:

Insert into People(Parent,POrder,PSurName,PBrDate,PStatus,PSalary)
values (0,1,'Архангельский Андрей Германович','05/20/1954',
       'Генеральный директор',1500.00);
Commit;

       Значение идентификатора записи не участвует в операторе, так как оно формируется в тригере Insert для таблицы. Однако, необходимо знать от каких полей зависит значение идентификатора. Для примера будем считать, что в данной случае оно зависит от полей PSurName и PBrDate, тогда оператор для вставки следующей записи приобретает следующий вид:

Insert into People(Parent,PSurName,PBrDate,PStatus,PSalary,POrder)
 Select PID,'Архипов Александр Григорьевич','06/21/1956',
            'Директор по производству',1350.00,1
 from People
 Where PSurName='Архангельский Андрей Германович'
   and PBrDate='05/20/1954';
Commit;

       Оператор Select, который используется вместо ключевого слова Values, служит для того чтобы найти значение идентификатора родительской записи, который ищется в той же таблице People при условиях заданных в клаузе Where. Значения остальных полей указываются также как с ключевым словом Values.
       Последовательность таких операторов, записанная как SQL-скрипт заполняет древовидную таблицу, включая информацию о связях между записями. Однако в отличие от обычного SQL-скрипта с "Insert into Table(..) values(..);", в данном случае важен порядок выполнения операторов, так как значение, в которое вставляется в поле Parent уже должно существовать в таблице, иначе оператор Select его не найдет и запись не будет вставлена. Хотя никаких ошибок при этом не будет.
       Реальный пример SQL-скрипта для заполнения нашей базы данных полностью приведен в файле [FB_SQL\dat\People.txt], начало которого приведено ниже:

/* Корень дерева */
Insert into People(PSurName,PBrDate,PStatus,PSalary)
 values('Архангельский Андрей Германович','05/20/1954',
        'Генеральный директор',1500.00);
Commit;

/* Первый уровень дерева */
Insert into People(Parent,PSurName,PBrDate,PStatus,PSalary,POrder)
 Select PID,'Архипов Александр Григорьевич','06/21/1956',
        'Директор по производству',1350.00,1
 from People
 Where PSurName='Архангельский Андрей Германович'
   and PBrDate='05/20/1954';
Insert into People(Parent,PSurName,PBrDate,PStatus,PSalary,POrder)
 Select PID,'Архипцев Аркадий Генрихович','06/21/1956',
        'Директор по Рекламе',1350.00,1
 from People
 Where PSurName='Архангельский Андрей Германович'
   and PBrDate='05/20/1954';
Insert into People(Parent,PSurName,PBrDate,PStatus,PSalary,POrder)
 Select PID,'Архаров Алексей Геннадьевич','07/22/1958',
        'Директор по маркетингу',1350.00,2
 from People
 Where PSurName='Архангельский Андрей Германович'
   and PBrDate='05/20/1954';
Insert into People(Parent,PSurName,PBrDate,PStatus,PSalary,POrder)
 Select PID,'Архмиров Анатолий Георгиевич','08/23/1960',
            'Директор по IT-сервису',1350.00,3
 from People
 Where PSurName='Архангельский Андрей Германович'
   and PBrDate='05/20/1954';
Commit;

/* Второй уровень 1 дерева */
Insert into People(Parent,PSurName,PBrDate,PStatus,PSalary,POrder)
 Select PID,'Борисов Александр Маркович','01/02/1957',
        'Зам. директора по производству',1250.00,1
 from People 
 Where PSurName='Архипов Александр Григорьевич'
   and PBrDate='06/21/1956';
Insert into People(Parent,PSurName,PBrDate,PStatus,PSalary,POrder)
 Select PID,'Бирюков Роман Аркадьевич','02/03/1959','Главный инженер',1250.00,2
 from People
 Where PSurName='Архипов Александр Григорьевич'
   and PBrDate='06/21/1956';
Commit;

/* Второй уровень 2 дерева */
Insert into People(Parent,PSurName,PBrDate,PStatus,PSalary,POrder)
 Select PID,'Виноградов Александр Иванович','07/07/1976','Продюссер',1300.00,1
 from People
 Where PSurName='Архипцев Аркадий Генрихович'
   and PBrDate='06/21/1956';
Insert into People(Parent,PSurName,PBrDate,PStatus,PSalary,POrder)
 Select PID,'Вицин Генрих Маркович','08/09/1976','Художник компютерной анимации',1300.00,2
 from People
 Where PSurName='Архипцев Аркадий Генрихович'
   and PBrDate='06/21/1956';
Commit;

© 01.08.2009, Архангельский А.Г.

<<Пред. Оглавление
Об Авторе
Все персоны
Главная страница
След.>>



Поддержите культуру
ЯндексЯндекс. ДеньгиХочу такую же кнопку

Google
 
Web azdesign.ru az-libr.ru


Дата последнего изменения:
Wednesday, 23-Oct-2013 09:02:58 UTC