2011-12-20 40 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)