Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Insert  [new]
VDionisV
Member

Откуда:
Сообщений: 22
Добрый день уважаемые форумчане.

Подскажите пожалуйста, как опытные и поведавшие многое, как правильно заполнять таблицы бд.

Есть например две таблицы ( Т1 и Т2)

T1 (P1(PK), P2)

T2 (S1(PK), S2, P1(FK)

P1 - primary key с автоматической генерацией значения.

T1.P1 = T2.P1

Как нужно правильно заполнять FK (внешний ключ) если для заполнения планируется создать хранимую процедуру, которую вызывать из клиента.

Insert в две таблицы сразу не получиться сделать, поэтому как я понимаю либо с помощью триггера
или с помощью функций Scope_identity или ident_current?
Может можно как нибудь проще это делать или это должно делаться автоматически сервером?

Заранее спасибо!
29 мар 15, 15:30    [17446783]     Ответить | Цитировать Сообщить модератору
 Re: Insert  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
output еще.
29 мар 15, 16:06    [17446844]     Ответить | Цитировать Сообщить модератору
 Re: Insert  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
VDionisV,

а откуда данные-то берутся?
Из каких-то внешних уже связанных таблиц
или построчно из какого-то клиента.
Короче, откуда берётся информация о том, что на что ссылается?
29 мар 15, 16:11    [17446852]     Ответить | Цитировать Сообщить модератору
 Re: Insert  [new]
VDionisV
Member

Откуда:
Сообщений: 22
Данные берутся из клиента по строчно.

Я просто не могу понять, как должны заполняться данные вторичного ключа. Я думал, что при вставке данных в T1 автоматически сгенерируется код в поле P1 ( primary key), а т.к. таблицы связаны между собой то код из T1.P1 появится в T2.P1(FK).
Но код в T2.P1(FK) не появляется. Вот собственно вопрос, либо я не правильно что то сделал, или нужно это прописывать с помощью функций scope_identiry или iden_current, т.е. я вставляю данные в T1, в строке столбца P1 генерируется код, с помощью указанных функций я определяю какой код сгенерировался и делаю insert в T2.P1 (fk). Такая схема получается?
29 мар 15, 16:36    [17446927]     Ответить | Цитировать Сообщить модератору
 Re: Insert  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
VDionisV,

у T1 триггеры есть? Какие?
29 мар 15, 16:38    [17446936]     Ответить | Цитировать Сообщить модератору
 Re: Insert  [new]
VDionisV
Member

Откуда:
Сообщений: 22
Пока нет не тригеров и не хранимых процедур. Я пока только создал таблицы. Но я хочу просто понять как это делать? Как вы это делаете? Как вы строите insert'ы которые вставляют данные во внешние ключи?
29 мар 15, 16:46    [17446964]     Ответить | Цитировать Сообщить модератору
 Re: Insert  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
VDionisV
Пока нет не тригеров и не хранимых процедур. Я пока только создал таблицы. Но я хочу просто понять как это делать? Как вы это делаете? Как вы строите insert'ы которые вставляют данные во внешние ключи?
Для порядка надо бы ещё знать версию сервера.
Но лучше всего использовать
INSERT T1() OUTPUT inserted....,.... INTO T2(...,...) VALUES(...,...)
Как-то так, ЕМНИП
29 мар 15, 16:56    [17446989]     Ответить | Цитировать Сообщить модератору
 Re: Insert  [new]
VDionisV
Member

Откуда:
Сообщений: 22
Допустим, мне нужно вставить данные в T1 и Т2

INSERT1
Insert T1 (P2)
Values (' test')
После вставки в поле T1.P1 сгенерируется код (допустим равный 100)

INSERT2
Insert T2 (S2)
Values ('sss')

После вставки в поле T2.P1 будет null или если для поля стоит not null. то поругается и не вставит данные.

Если сделать:

Select * from T1,T2
where T1.P1=T2.P1

результат будет равным 0. А результат равен 0 потому что, T1.P1=100 - Primary key, а T2.P1 = null - Foreing key.

Значение в T2.P1 я сам должен вставлять ? Или за этим смотрит сервер и вставляет?
29 мар 15, 17:12    [17447012]     Ответить | Цитировать Сообщить модератору
 Re: Insert  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2567
VDionisV
Значение в T2.P1 я сам должен вставлять ? Или за этим смотрит сервер и вставляет?
Сервер за этим не смотрит, так что вставлять должен сам.
Если T1.P1 - IDENTITY, то
-- INSERT1
DECLARE @P1 INT
Insert T1 (P2)
Values (' test')
--После вставки в поле T1.P1 сгенерируется код (допустим равный 100)
SET @P1 = SCOPE_IDENTITY()

--INSERT2
Insert T2 (S2, P1)
Values ('sss', @P1)
либо использовать OUTPUT в первом INSERT, как писали выше
-- INSERT1
DECLARE @P1 TABLE (P1 INT)
Insert T1 (P2)
OUTPUT INSERTED.P1 INTO @P1(P1)
Values (' test')

--INSERT2
Insert T2 (S2, P1)
SELECT 'sss', P1 FROM @P1
30 мар 15, 10:37    [17448478]     Ответить | Цитировать Сообщить модератору
 Re: Insert  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
PaulYoung
VDionisV
Значение в T2.P1 я сам должен вставлять ? Или за этим смотрит сервер и вставляет?
Сервер за этим не смотрит, так что вставлять должен сам.
Если T1.P1 - IDENTITY, то
-- INSERT1
DECLARE @P1 INT
Insert T1 (P2)
Values (' test')
--После вставки в поле T1.P1 сгенерируется код (допустим равный 100)
SET @P1 = SCOPE_IDENTITY()

--INSERT2
Insert T2 (S2, P1)
Values ('sss', @P1)
либо использовать OUTPUT в первом INSERT, как писали выше
-- INSERT1
DECLARE @P1 TABLE (P1 INT)
Insert T1 (P2)
OUTPUT INSERTED.P1 INTO @P1(P1)
Values (' test')

--INSERT2
Insert T2 (S2, P1)
SELECT 'sss', P1 FROM @P1
А так не прокатит?
INSERT T1(P2)
OUTPUT inserted.P1,'sss' INTO T2(P1,S2)
VALUES(' test');
30 мар 15, 12:07    [17449184]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить