2011-12-20 13 views
11

Podobny do uzyskania ostatnio wstawionego identyfikatora, czy istnieje miły mechanizm w mysql, aby uzyskać ostatni usunięty identyfikator po usunięciu wiersza?Pobierz ostatni usunięty identyfikator w mysql

+0

Dlaczego potrzebujesz wartości, których nie ma w bazie danych? Aby uzyskać dokładniejszą odpowiedź, jest to bardzo ważna kwestia. – danihp

Odpowiedz

9

Przez "ID" zakładam, że masz na myśli "auto-inkrement"?

Ponieważ możesz usunąć dowolny dowolny wiersz (lub zestaw wierszy) w dowolnym czasie: nie, nie ma możliwości określenia WHAT wiersza (lub wierszy), który został ostatnio usunięty.

Ty może jednak stworzyć „spust”, aby zapisać te informacje dla Ciebie:

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

3

Zamiast tworzyć spust, trzeba korzystać z tego za każdym razem, gdy zostanie usunięty

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

To zależy od sposobu usuwania. Ale jeśli masz całkowitą kolumny id, można użyć następującego Hack:

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

SELECT LAST_INSERT_ID(); 

ale należy upewnić się, że zwarć MySQL dawnego stanu i nie optymalizuje uruchamianie user_id = LAST_INSERT_ID(user_id) pierwszy. To można dostosować zapytanie do czegoś takiego:

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

P.S. Nie pytam, dlaczego możesz tego potrzebować. Najprawdopodobniej nie powinien chcieć go =)

0

Jeśli zdarzy ci się być wywołanie bazy danych MySQL z JDBC, a następnie można wykonać SELECT i nazywają ResultSet.deleteRow() jak można przeczytać na podstawie wyników i chwycić identyfikatora.

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

Przykład tabeli

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

Hack z LAST_INSERT_ID już wspomniano, ale odpowiedź strzela fakt, że może to agregacji!

ostatni identyfikator wkładki ma ustalony rozmiar, ale w przypadku małych klawiszy można go użyć.

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) 
Powiązane problemy