Как вставить несколько записей и получить значение идентификационных данных?

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

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

54
задан Michał Powaga 17 April 2013 в 21:42
поделиться

7 ответов

MBelly является правильным на деньгах - Но тогда триггер будет всегда пытаться обновить таблицу B, даже если это не потребовало (Поскольку Вы также вставляете от таблицы C?).

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

, Если бы это был я, и это не было строго ограничено во времени, я пошел бы с курсором.

-7
ответ дан Meff 7 November 2019 в 07:45
поделиться

Используйте ouput пункт с 2005:

DECLARE @output TABLE (id int)

Insert into A (fname, lname)
OUTPUT inserted.ID INTO @output
SELECT fname, lname FROM B

select * from @output

теперь Ваша табличная переменная имеет значения идентификационных данных всех строк, которые Вы вставляете.

145
ответ дан Andy Irving 7 November 2019 в 07:45
поделиться

Читая Ваш вопрос тщательно, Вы просто хотите обновить таблицу B на основе новых значений идентификационных данных в таблице A.

После того, как вставка закончена, просто выполните обновление...

UPDATE B
SET NewID = A.ID
FROM B INNER JOIN A
     ON (B.FName = A.Fname AND B.LName = A.LName)

Это предполагает, что FName / комбинация LName может привыкнуть к соответствию ключа записи между таблицами. Если дело обстоит не так, Вы, возможно, должны добавить дополнительные поля, чтобы гарантировать, чтобы записи соответствовали правильно.

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

5
ответ дан njr101 7 November 2019 в 07:45
поделиться

Если Вы всегда хотите это поведение, Вы могли бы поместить ПОСЛЕ ТОГО, КАК ВСТАВЛЯЮТ, включают TableA, который обновит таблицу B.

0
ответ дан Matt 7 November 2019 в 07:45
поделиться

Можно добраться путем присоединения на номер строки . Это возможно, потому что, так как это - идентификационные данные, это просто увеличит, поскольку Вы добавляете объекты, которые будут в порядке, что Вы выбираете их.

0
ответ дан Darren Kopp 7 November 2019 в 07:45
поделиться

Я предлагаю использовать тип uniqueidentifier вместо идентификационных данных. Я этот случай можно генерировать идентификаторы перед вставкой:

update B set NewID = NEWID()

insert into A(fname,lname,id) select fname,lname,NewID from B
0
ответ дан Michał Powaga 7 November 2019 в 07:45
поделиться

Насколько я понимаю его проблема, которую Вы имеете, то, что Вы хотите ВСТАВИТЬ в Таблицу A, которая имеет столбец идентификационных данных, и Вы хотите сохранить идентификационные данные от Таблицы B, которая не делает.

, Чтобы сделать это, Вам придется просто включить идентификационные данные, вставляют на таблице A. Это позволит Вам определять свой идентификатор на вставке и, пока они не конфликтуют, необходимо быть в порядке. Тогда можно просто сделать:

Insert into A(identity, fname, lname) SELECT newid, fname, lname FROM B

Не уверенный, какой DB Вы используете, но для SQL-сервера, которым была бы команда для включения вставки идентификационных данных:

set identity_insert A on
0
ответ дан Michał Powaga 7 November 2019 в 07:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: