вставлять данные в несколько таблиц

привет у меня проблема вставить данные в несколько таблиц. я определил первичный ключ и ссылочный ключ в таблицах, теперь я хочу вставить данные в обе таблицы в одном запросе.......как я могу это сделать.........????? ??


person Community    schedule 22.08.2009    source источник


Ответы (4)


Your question isn't exactly clear on what the particular problem is. I can see three possibilities:
1. You want to insert into two tables wiht a single INSERT statement
2. You want to do two inserts, but without anything else being able to 'get in the middle'
3. You want to insert into one table, then get the primary key to insert into the second table


Ответ на 1. прост:

You can't.


Ответ на 2. тоже прост:

BEGIN TRANSACTION
   INSERT INTO <table1> (a,b,c) VALUES (1,2,3)
   INSERT INTO <table2> (a,b,c) VALUES (1,2,3)
COMMIT TRANSACTION


Ответ на 3. имеет несколько возможностей. Каждый в зависимости от того, что вы хотите сделать. Скорее всего, вы захотите использовать SCOPE_IDENTITY(), но вы также можете для поиска @@identity и IDENT_CURRENT(), чтобы понять различные варианты и сложности.

BEGIN TRANSACTION

   INSERT INTO <dimension_table> (name)
      VALUES ('my new item')

   INSERT INTO <fact_table> (item_id, iteam_value)
      VALUES (SCOPE_IDENTITY(), 1)

COMMIT TRANSACTION
person MatBailie    schedule 22.08.2009

Для этого и предназначены транзакции. Стандартный SQL не допускает одновременную вставку одного оператора в несколько таблиц. Правильный способ сделать это:

-- begin transaction
insert into table 1 ...
insert into table 2 ...
commit
person paxdiablo    schedule 22.08.2009

Поддерживает ли ваш язык конструкцию INSERT ALL? Если да, то это лучший способ сделать это. На самом деле это единственный способ. Я разместил пример этой конструкции в другом потоке SO (этот пример синтаксис взят из Oracle SQL).

Другой вариант — построить транзакционную хранимую процедуру, которая вставляет запись в таблицу первичного ключа, а затем запись в ссылочную таблицу.

person APC    schedule 22.08.2009

И 1 по вашему выбору, чтобы сделать это, используйте ORM (например, Hibernate, NHibernate), вы создаете свой объект и устанавливаете другое отношение к нему и, наконец, просто сохраняете основной объект, например:

A a;
B b;
C c;
a.set(b);
a.set(c);
DAO.saveOrUpdate(a);

вы должны заметить свой DAO.saveOrUpdate(a); строка кода просто работает с спящим режимом, но вставляет данные в 3 таблицы A, B, C.

person Am1rr3zA    schedule 22.08.2009