Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Web, ASP.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/10: Рейтинг темы: голосов - 10, средняя оценка - 4.90
master
1

Вопрос по работе с T-SQL (INSERT)

03.08.2007, 11:18. Просмотров 1723. Ответов 10
Метки нет (Все метки)

Думаю я не первый сталкиваюсь с такой проблемой.
есть связанные таблицы Т1 и Т2, связь один-ко-многим.
простой пример:

Т1:
id - счетчик
name - имя

Т2:
id - счетчик
t1_id - id из Т1
sub_name - подназвание

мне нужно вставить сначала в Т1, а потом связанную запись в Т2, т.е. в Т2 мне нужен t1_id, который получился при вставке в Т1 (id).

естественно такая запись не канает:
insert into T1 (name) values ('new name');
insert into T2 ((select id from T1 where name='new name'), 'sub name');

как бы это поизящнее изобразить, не выбирая recordset после первого инсерта ?

И еще попутный вопрос.
Есть таблица с полем-счетчик, приращение - 1, но при вставке новой строки иногда перескакивает на 3 значения ! (причем ранее строки не удалялись).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2007, 11:18
Ответы с готовыми решениями:

Sql запрос insert
Я студент и впервые пишу программу для ASP, Мне нужно сделать по лабораторной страницу для...

тип дата в SQL INSERT
У меня такая проблема. в таблице есть поле типа датавремя. Таблица аксессовская. Селектом могу...

Вопрос по работе со списками
foreach (var cache in cachelist) { if (cache.datetime <...

insert sql mvc c#
всем привет не могу понять как вводить данные в sql через mvc искал в гугле находил только...

Люди, помогите! Вопрос по работе в Builder'e с таблицами SQL
Товарищи, помогите пожалуйста. Конечно, может я не по адресу, не знаю. Вопрос такой: При...

10
Karamba
03.08.2007, 13:50 2
а какая база у тебя? если MSSQL, то есть смысл через StoredProcedure это сделать. например вот так:

insert into T1 (name) values ('new name')
insert into T2 (@@identity, 'sub name')

хотя, судя по синтаксису, у тебя Access?
palex
1 / 1 / 0
Регистрация: 16.04.2007
Сообщений: 86
03.08.2007, 13:55 3
если это SQL Server, то лучше всего использовать хранимую процедуру:

insert into T1 (name) values ('new name')
insert into T2 (@@IDENTITY, 'sub name')

для Access возможно это поможет:
http://support.microsoft.com/support/kb/articles/Q221/9/31.ASP
0
palex
1 / 1 / 0
Регистрация: 16.04.2007
Сообщений: 86
03.08.2007, 13:56 4
долго думал.
0
03.08.2007, 13:56
Karamba
03.08.2007, 14:00 5
да вот и я тоже сначала не понял в чем фишка, корда письмом пришло уведомление об изменениях
наши тексты почти как близнецы-братья
master
03.08.2007, 14:01 6
База MSSQL 7.
почему обязательно в хранимой процедуре?
Нельзя просто:
sql='insert into T1 (name) values ('new name'); insert into T2 (@@identity, 'sub name')'
conn.Execute(sql) ?
Такой вопрос, этот последний вставленный идентификатор именно для моей сессии или для всех?
Чтобы не получилось так, что я конекчусь под одним юзером в базу со страницы и в одно время несколько пользователей сделают insert, получу ли именно свой id тогда?
Karamba
03.08.2007, 14:05 7
ну я просто так в строчку не пробовал никогда. может сработает - потестируй.
а @@identity - это только для твоей сессии. если в этот же момент кто-то еще вставляет, то для них будет свое значение @@identity
Karamba
03.08.2007, 14:09 8
и вообще, моё личное мнение - если есть возможность работать с хранимыми процедурами, то лучше делать через них. чистый SQL в коде - это не есть хорошо.
если StoredProcedure с параметрами (ну или без них), то посмотри вот это:
http://www.relib.com/topic.asp?id=710768&tp=1

я там привел пример своей DLL, которая как раз все это и делает.
master
03.08.2007, 14:18 9
Да можно и в одну строку и в две и три.
Единственное что меня беспокоило, так это то, чтобы ко мне мой id пришел, но раз ты говоришь, значит так оно и есть :-)
master
03.08.2007, 14:31 10
В догонку, как насчет того же, только для инструкции UPDATE ?
palex
1 / 1 / 0
Регистрация: 16.04.2007
Сообщений: 86
03.08.2007, 14:35 11
After an INSERT, SELECT INTO, or bulk copy statement completes, @@IDENTITY contains the last identity value generated by the statement. If the statement did not affect any tables with identity columns, @@IDENTITY returns NULL. If multiple rows are inserted, generating multiple identity values, @@IDENTITY returns the last identity value generated. If the statement fires one or more triggers that perform inserts that generate identity values, calling @@IDENTITY immediately after the statement returns the last identity value generated by the triggers. The @@IDENTITY value does not revert to a previous setting if the INSERT or SELECT INTO statement or bulk copy fails, or if the transaction is rolled back.
0
03.08.2007, 14:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.08.2007, 14:35

Вопрос по insert
Делаю выборку из одной таблицы и пишу ее в другую insert into t1 select Ключ, Атрибут from t2...

C# Sql INSERT INTO
Здравствуйте! Суть проблемы. При выполнении запроса Insert появляется ошибка "Не совпадает число...

SQL INSERT
Помогите найти причину почему не вставляет строку в БД? import java.sql.Connection; import...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru