Получить последний удаленный идентификатор в MySQL - PullRequest
13 голосов
/ 21 декабря 2011

Подобно LAST_INSERT_ID(), есть ли в MySQL хороший механизм для получения последнего удаленного идентификатора после удаления строки?

Ответы [ 5 ]

9 голосов
/ 21 декабря 2011

Под "ID" я предполагаю, что вы имеете в виду "автоинкремент"?

Поскольку вы можете удалить любую произвольную строку (или набор строк) в любое время: нет, невозможно определить, КАКУЮ строку (или строки) вы удалили совсем недавно.

Вы можете , однако создайте «триггер», чтобы сохранить эту информацию для вас:

http://dev.mysql.com/doc/refman/5.0/en/triggers.html

4 голосов
/ 22 декабря 2011

Вместо создания триггера, вам нужно использовать его каждый раз при удалении

declare @table1 table(id int identity,name varchar(50))
     insert into @table1 (name)  values('abc')
     insert into @table1 (name)  values('xyz')
      insert into @table1 (name) values('pqr')
       insert into @table1 (name)  values('wqe')
     delete from  @table1 output deleted.name,deleted.id where  id=3
2 голосов
/ 22 декабря 2011

Зависит от того, как вы делаете удаления.Но если у вас есть столбец с целочисленным идентификатором, вы можете использовать следующий хак:

DELETE FROM users
WHERE login = 'newtover' AND user_id = LAST_INSERT_ID(user_id);

SELECT LAST_INSERT_ID();

Но вы должны убедиться, что MySQL закорачивает прежнее условие и не оптимизирует для запуска user_id = LAST_INSERT_ID(user_id) в первую очередь.То есть вы можете настроить запрос на что-то вроде:

DELETE FROM users
WHERE login = 'newtover' AND IFNULL(user_id, 0) = LAST_INSERT_ID(user_id);

PS Я не спрашиваю, зачем вам это может понадобиться.Скорее всего, вы этого не должны хотеть =)

0 голосов
/ 23 июня 2017

Хак с last_insert_id уже упоминался, но в этом ответе отсутствует тот факт, что он может агрегировать!

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

mysql> insert into t1 () values (),(),(),(),(),(),();
Query OK, 7 row affected (0.00 sec)

mysql> select * from t1;
+---+
| n |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
+---+
7 rows in set (0.00 sec)
select last_insert_id(0); -- clear accumulator
+-------------------+
| last_insert_id(0) |
+-------------------+
|                 0 |
+-------------------+
1 row in set (0.00 sec)

-- keys will be separated by zeroes
mysql> delete from t1 
        where last_insert_id(last_insert_id() 
                             * pow(10, 2 + floor(log(n)/log(10))) + n)
        limit 6;  
Query OK, 6 rows affected (0.00 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|      10203040506 |
+------------------+
1 row in set (0.00 sec)

-- rows deleted
mysql> select * from t1 limit 1;
+---+
| n |
+---+
| 7 |
+---+
1 row in set (0.00 sec)
0 голосов
/ 08 декабря 2015

Если вы случайно вызываете свою базу данных MySQL из JDBC, тогда вы можете выполнить SELECT и вызвать ResultSet.deleteRow(), когда прочитаете результаты и получите идентификаторы.

import java.sql.*;

public class Delete {
    public static void main(String... args) throws SQLException {
        try(Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/test?user=john&password=denver");
            PreparedStatement statement = conn.prepareStatement("select id from some_table where event=?")
        ) {
            statement.setString(1, "test");
            try(ResultSet result = statement.executeQuery()) {
                System.out.println("deleting id " + result.getLong("id"));
                result.deleteRow();
            }
            conn.commit();
        }
    }
}

Пример таблицы

create table some_table(
  id bigint(12),
  event varchar(100)
);

insert into some_table values(1, 'test');
insert into some_table values(2, 'test');
insert into some_table values(3, 'test');
insert into some_table values(4, 'other');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...