2011-12-20 26 views
11

Tương tự như nhận id được chèn lần cuối, có cơ chế tốt nào trong mysql để lấy ID đã xóa sau cùng sau khi một hàng đã bị xóa không?Nhận id bị xóa cuối cùng trong mysql

+0

Tại sao bạn cần giá trị không còn trong cơ sở dữ liệu? Để có câu trả lời chính xác hơn, đây là một vấn đề quan trọng. – danihp

Trả lời

9

Bằng "ID", tôi giả sử bạn có nghĩa là "tự động tăng"?

Vì bạn có thể xóa bất kỳ hàng tùy ý nào (hoặc tập hợp các hàng) bất cứ lúc nào: không, không có cách nào cho biết WHICH hàng (hoặc hàng) bạn đã xóa gần đây nhất.

Bạn thể Tuy nhiên, tạo ra một "cò" để lưu thông tin này cho bạn:

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

3

Thay vì tạo ra một kích hoạt, bạn cần phải sử dụng này mỗi và mỗi khi bạn xóa

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

Tùy thuộc vào cách bạn xóa. Nhưng nếu bạn có một cột số nguyên id, bạn có thể sử dụng hack như sau:

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

SELECT LAST_INSERT_ID(); 

Nhưng bạn nên chắc chắn rằng MySQL ngắn mạch với điều kiện cũ và không tối ưu hóa để chạy user_id = LAST_INSERT_ID(user_id) đầu tiên. Đó là bạn có thể điều chỉnh truy vấn cho một cái gì đó như:

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

P.S. Tôi không hỏi tại sao bạn có thể cần điều này. Có thể, bạn không nên muốn nó =)

0

Nếu bạn tình cờ gọi cơ sở dữ liệu MySQL của mình từ JDBC, bạn có thể thực hiện SELECT và gọi ResultSet.deleteRow() khi đọc qua kết quả và lấy 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(); 
     } 
    } 
} 

Ví dụ bảng

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

Các hack với last_insert_id đã được đề cập, nhưng câu trả lời mà nhớ thực tế là nó có thể tổng hợp!

id chèn cuối cùng có kích thước cố định nhưng đối với các khóa nhỏ, nó có thể được sử dụng.

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) 
Các vấn đề liên quan