#java #sql #sql-server #spring #mybatis
#java #sql #sql-сервер #spring #mybatis
Вопрос:
Я использую mybatis mapper в Java для возврата последнего сгенерированного идентификатора таблицы в SQL Server после инструкции insert с условием вставить запись или нет, проблема в том, что я получаю идентификатор, даже если запись не была вставлена, есть идеи, почему?
фрагмент моего кода:
В моем mapper:
<insert id="insertStatment" parameterType="HashMap"
useGeneratedKeys="true" keyProperty="id">
IF NOT EXISTS (SELECT TOP 1 1 FROM table
WITH(NOLOCK) WHERE...)
INSERT INTO table
(
column1,
column 2
)
VALUES
(
value1,
value 2
)
<selectKey resultType="int" order="AFTER" keyProperty="id">
SELECT @@IDENTITY as returnedId
</selectKey>
</insert>
В моем DAO:
session.insert("insertStatment", map);
Integer id= (Integer) map.get("id");
Проблема в том, что даже когда вставка не была сделана, я получаю идентификатор, отличный от идентификатора (автоматически сгенерированного) моей таблицы, любая помощь?
Заранее благодарю вас.
Комментарии:
1. Вам действительно нужен
NOLOCK
дляEXISTS
запроса ..?2. Если вы ничего не вставляете, то
@@IDENTITY
должны вернутьNULL
; если вы также не выполняетеINSERT
в другой области, о которой вы нам не рассказали?@@IDENTITY
не ограничивается одной и той же областью, поэтому, если это так, вам было бы лучше использоватьSCOPE_IDENTITY
.3. @Larnu Спасибо за ваш ответ, я использую exists , потому что мне нужно проверить, есть ли запись для данного идентификатора, тогда я не хочу вставлять какие-либо данные, есть ли какой-либо другой поворот?
4. Я не спрашиваю о
EXISTS
, @Elias, я спрашиваю, почему существуетNOLOCK
.5. Ознакомьтесь с вредными привычками: везде ставить NOLOCK