возврат последнего сгенерированного идентификатора в таблицу SQL Server после вставки, даже если вставка не была выполнена в mybatis mapper

#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