2011-12-20 129 views
11

与获取最后插入的id类似,是否有一个很好的机制在mysql被删除后获取最后删除的ID?获取mysql中的最后一个删除的ID

+0

为什么你需要不再在数据库中的值?为了获得更准确的答案,这是一个基本问题。 – danihp 2011-12-22 09:39:49

回答

9

通过“ID”,我假设你的意思是“自动增量”?

由于您可以随时删除任何任意行(或行集):不,无法告诉您最近删除的行(或多行)。

可以,但是,创建一个“触发器”来保存此信息对您:

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

3

而是创建触发器,你需要在你删除使用这个每一次

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 
1

这取决于您如何进行删除操作。但是,如果你有一个整数id列,您可以使用下面的技巧:

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.我不问你为什么需要这个。最可能的是,你不应该希望它=)

0

如果你碰巧打电话从JDBC MySQL数据库,那么你就可以执行SELECT并呼吁ResultSet.deleteRow()你通过读取结果和抢的ID。

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'); 
0

与LAST_INSERT_ID的黑客已经提到,但这个答案 错过,它可以聚合的事实!

最后一个插入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)