Как получить последний вставленный id, есть ли хороший механизм в mysql, чтобы получить последний удаленный идентификатор после того, как строка была удалена?
Получить последний удаленный идентификатор в mysql
Ответ 1
Под "ID", я предполагаю, что вы имеете в виду "автоинкремент"?
Так как вы можете удалить любую произвольную строку (или набор строк) в любое время: no, нет способа сообщить WHICH строку (или строки), которую вы недавно удалили.
Однако вы можете создать "триггер", чтобы сохранить эту информацию для вас:
Ответ 2
Вместо создания триггера вы должны использовать это каждый раз, когда вы удаляете
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
Ответ 3
Это зависит от того, как вы делаете удаления. Но если у вас есть столбец с целым числом, вы можете использовать следующий хак:
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);
P.S. Я не спрашиваю, зачем вам это нужно. Скорее всего, вы не должны этого хотеть =)
Ответ 4
Если вы случайно вызываете свою базу данных 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');
Ответ 5
Хакер с 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)