2011-12-20 34 views
11

Similar a la última identificación insertada, ¿hay un buen mecanismo en mysql para obtener la última identificación eliminada después de que se haya eliminado una fila?Obtener la última identificación eliminada en mysql

+0

¿Por qué necesita valores que ya no están en la base de datos? Para una respuesta más precisa, este es un problema esencial. – danihp

Respuesta

9

¿Por "ID", supongo que quiere decir "autoincremento"?

Dado que puede eliminar cualquier fila arbitraria (o conjunto de filas) en cualquier momento: no, no hay forma de saber QUÉ fila (o filas) borró recientemente.

Usted puede, sin embargo, crear un "disparador" para guardar esta información para usted:

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

3

En lugar de crear un disparador, es necesario utilizar esta cada vez cuando se elimina

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

Depende de cómo se realizan las eliminaciones. Pero si usted tiene una columna entera ID, puede utilizar este truco:

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

SELECT LAST_INSERT_ID(); 

embargo, usted debe asegurarse de que MySQL cortocircuita la condición anterior y no optimiza para funcionar user_id = LAST_INSERT_ID(user_id) primero. Es decir, puede ajustar la consulta a algo como:

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

P.S. No pregunto por qué podría necesitar esto. Lo más probable es que no debes quererlo =)

0

Si le sucede a estar llamando a su base de datos MySQL desde JDBC, a continuación, puede ejecutar un SELECT y llame ResultSet.deleteRow() a medida que lea los resultados y agarrar los identificadores.

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(); 
     } 
    } 
} 

tabla Ejemplo

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

El truco con LAST_INSERT_ID ya se mencionó, pero esa respuesta no ve hecho de que podría agregar!

última identificación de inserción tiene un tamaño fijo, pero para las teclas pequeñas podría ser utilizado.

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) 
Cuestiones relacionadas