2012-06-21 4 views
1

Доброе утро. У меня две таблицы, а одна - другая. Когда я вставляю в основную таблицу, первичный ключ автогенерируется, а именно поле Identity. Мне нужно вставить это значение во вторую таблицу.Вставка значения столбца идентификатора в другую таблицу

Я узнал, что использование предложения OUTPUT даст мне только что введенное значение идентификатора, поэтому я попробовал это.

insert into owners (pId) 
    insert into personal (firstName) 
    output inserted.pId 
    values ('fn') 

Это не работает. Я получаю сообщение об ошибке:

Incorrect syntax near the keyword 'insert'

Персональный стол является основной таблицей, а таблица владельцев содержит внешний ключ. Как я могу сделать требуемое в SQL Server?

Я застрял-сюда в течение последних двух дней ...

+0

Можете ли вы опубликовать структуру обеих таблиц? –

+0

Хотите, чтобы я опубликовал всю структуру, или только соответствующие поля будут делать? –

ответ

3

Попробуйте следующие шаги

1) Применить уровень транзакций при вставке

2) Получить последний добавленный идентификатор, используя функцию scope_identity().

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

попробуйте, это сработает для вас.

+0

Можете ли вы PLZ объяснить уровень транзакции ?? я полагаю, что я явно блокировал рассказы, которые плохо работают, но я хотел знать, есть ли там просто ay out ... –

+0

Когда вы применяете уровень транзакций, он блокирует таблицы, которые вы используете в этой транзакции, и блокирует блокировку таблицы, когда вы заканчиваете сделка. Во время транзакции другой запрос будет поставлен в очередь сервером Sql, и после завершения этой транзакции будет выполнен другой запрос. Я предлагаю вам использовать уровень транзакции i.e Begin Trans ....... Commit Trans в коде, это позволит избежать любого другого пользователя для выполнения вставки в одно и то же время. Спасибо – Asif

+0

Действительно ли транзакции фиксируют таблицы? Я имею в виду, не будет ли это настоящим узким местом? –

2

Вы можете использовать функцию SCOPE_IDENTITY(), чтобы вернуть значение идентификатора вставляется.

DECLARE @id INT 
INSERT INTO [Personal] (Colums ....) VALUES (this, that, stuff) 
SET @id = SCOPE_IDENTITY() 

INSERT INTO [Owners] (Colums ....) VALUES (@id ....) 
+0

Я понимаю, что SCOPE_IDENTITY дает последний вставленный идентификатор в заданной области, но необязательно в данной таблице ... Приложение размещено в сети, а несколько пользователей, действующих, не дадут мне точного результата, я думаю. Например, после того, как я обновил таблицу ** личный **, другие/те же пользователи могут обновлять другие таблицы до того, как вставка в ** владельцы ** будет выполнена. SCOPE_IDENTITY затем даст мне последнее значение идентификации, но не из таблицы личных , Или я ошибаюсь ?? –

+0

Извините, я не уверен, понимаю ли вы, что вы говорите, можете ли вы уточнить свой вопрос? – Kane

+0

разные пользователи имеют разный объем. поэтому SCOPE_IDENTITY() вернет идентификатор из той же области. и у вас никогда не будет конфликта, вы упоминаете – Rab

2

Я думаю, что Ваш вариант заключается в использовании SCOPE_IDENTITY() но другие ближайший к вашему выбору является IDENT_CURRENT(‘tablename’) поэтому я думал, я отправляю деталь детали других вариантов идентичности, а также которые могут помочь вам понять ваш выбор и мощь полезно в другое время

@@IDENTITY It returns the last IDENTITY value produced on a connection, regardless of the table that produced the value, and regardless of the scope of the statement that produced the value.


SCOPE_IDENTITY() It returns the last IDENTITY value produced on a connection and by a statement in the same scope, regardless of the table that produced the value.


IDENT_CURRENT(‘tablename’) It returns the last IDENTITY value produced in a table, regardless of the connection that created the value, and regardless of the scope of the statement that produced the value.

+0

Я думаю, что все три не будут делать ... Проблема в том, что несколько пользователей будут работать из разных областей, в разных таблицах. Мне нужно найти значение идентификатора данного кортежа, который я только что вставил. Обратите внимание на слова ** I ** и ** с учетом набора **. Я имею в виду, что у меня не могут быть результаты из других таблиц или областей, мешающих ... –

3

Поскольку OUTPUT положение не может быть использовано непосредственно из внешнего ключа, можно добавить сгенерированные идентификаторы во временную таблицу, а затем вставить эти значения в owners таблицы:

BEGIN TRANSACTION 

CREATE TABLE #ids(ID INT) 
INSERT INTO personal(firstName) 
    OUTPUT inserted.pid INTO #ids 
    SELECT 'A' 
    UNION SELECT 'B' 

INSERT INTO owners(pid) 
    SELECT ID FROM #ids 

COMMIT TRANSACTION 

SCOPE_IDENTITY тоже будет работать, но это ограниченное одним значением.

+0

Какое время жизни и объем временной таблицы? Я имею в виду, могут ли другие подобные утверждения, но с другой областью вставки в iy ?? –

+0

Локальная временная таблица доступна только для текущего соединения. Вы можете иметь глобальные временные таблицы (помеченные знаком '##'), которые доступны для всех подключений. См. [MSDN] (http://msdn.microsoft.com/en-us/library/ms190315.aspx). –

4

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

INSERT INTO dbo.personal(firstName) 
OUTPUT INSERTED.pId INTO dbo.owners(pId) 
VALUES('fn') 

Это будет вставить новую строку в personal и установить колонны firstName в fn. Из этой вставки вставленный столбец идентификатора строки pId затем вставляется в другую таблицу, owners, в столбец pId этой таблицы.

Для получения дополнительной информации см. MSDN documentation on the OUTPUT clause - вы можете вывести любое из вставленных значений на консоль (например, SQL Server Mgmt Studio) или вывести эти значения во временную или постоянную таблицу.

Update: как «dradu» отметила, - этот подход не будет работать в вашем случае здесь, так как столбец в таблице owners является частью ограничения FK (я пропустил этот момент из вашего вопроса) , Таким образом, вы должны будете использовать какой-то другой способ сделать это - вероятно, выводя необходимую информацию в переменной временной таблицы/таблицы в коде

+1

Я не думаю, что предложение 'OUTPUT' будет работать напрямую, потому что таблица' owner' участвует в ограничении внешнего ключа. Из [ссылки MSDN] (http://msdn.microsoft.com/en-us/library/ms177564.aspx), о котором вы упоминали: output_table не может: разрешены триггеры, определенные на нем; Участвовать по обе стороны ограничения FOREIGN KEY; У вас есть ограничения CHECK или разрешенные правила. –

+0

@marc_s no, таблица владельцев не содержит поле pId. Мне нужно, чтобы это было автоматически обновлено, а другие значения, я должен вставить сам. –

+0

@Anudeep Bulla: Итак, вы начали с неправильного оператора SQL, вы получили правильные ответы, которые работали в некоторых условиях, но вас не устраивает их, потому что они не работают при определенных обстоятельствах, которые вы не указали. Возможно, вам следовало бы сделать вопрос более ясным или подумать о том, чего вы действительно хотите достичь. Это не работа сообщества, чтобы извлекать информацию о вашем вопросе. –

Смежные вопросы