вставить данные в несколько таблиц - PullRequest
1 голос
/ 22 августа 2009

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

Ответы [ 4 ]

4 голосов
/ 22 августа 2009

Ваш вопрос не совсем ясен о том, в чем конкретно заключается проблема. Я вижу три возможности:
1. Вы хотите вставить в две таблицы один оператор INSERT
2. Вы хотите сделать две вставки, но без чего-либо еще «в середине»
3. Вы хотите вставить в одну таблицу, а затем получить первичный ключ для вставки во вторую таблицу


Ответ на 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
1 голос
/ 22 августа 2009

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

-- begin transaction
insert into table 1 ...
insert into table 2 ...
commit
0 голосов
/ 22 августа 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.

0 голосов
/ 22 августа 2009

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

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

...