2013-08-12 42 views
8

Tôi đang sử dụng MySQL. Tôi muốn lấy giá trị tiếp theo mà cột AUTO_INCREMENT sẽ lấy mà không cần nhập một bản ghi mới.Tìm giá trị tiếp theo của cột AUTO_INCREMENT trong MySQL

create table ABC(id int(10) NOT NULL AUTO_INCREMENT,name char(10)); 

Trong oracle tôi đã sử dụng sequencename.nextval(); Nhưng tôi nên sử dụng gì trong MySQL?

Đây là lý do tại sao tôi đã làm không sử dụng

select max(id) from ABC; 

Giả sử tôi có một mục với id = 2. Bây giờ cột id sẽ có giá trị tiếp theo là 3. Trước khi tôi tạo bản ghi với id = 3, Nếu tôi xóa bản ghi với id = 2. Câu trả lời cho truy vấn tôi đã đề cập sẽ là 2. Nhưng tôi muốn giá trị thực tế 3, mà cột auto_increment sẽ lấy.

+0

không. Tôi muốn nhận được một giá trị. Nhưng những câu trả lời này in một mô tả. Không phải là giá trị có thể truy xuất được –

+0

http://www.microshell.com/database/mysql/emulating-nextval-function-to-get-sequence-in-mysql/ – Mihai

+0

SỬ DỤNG MÃ NÀY: 'SELECT (IFNULL (max (id), 0) + 1) làm id từ bảng'. IFNULL sẽ hữu ích nếu không có bản ghi trong bảng –

Trả lời

8

tình trạng bảng truy vấn như thế này:

SHOW TABLE STATUS WHERE `Name` = 'table_name' 

Bây giờ trong kết quả mà bạn sẽ nhận được một cột tên là Auto_increment. Đây là giá trị mà bạn đã yêu cầu.

Trong JAVA:

conn = DriverManager.getConnection(connectionUrl, connectionUser, connectionPassword); 
stmt = conn.createStatement(); 
rs = stmt.executeQuery("SHOW TABLE STATUS WHERE `Name` = 'table_name'"); 
rs.next(); 
String nextid = rs.getString("Auto_increment"); 

Full ví dụ ở đây: http://www.avajava.com/tutorials/lessons/how-do-i-use-jdbc-to-query-a-mysql-database.html

+0

Có nó đang cho đầu ra. Làm cách nào để truy xuất giá trị đó từ trạng thái được hiển thị? chọn auto_increment từ (HIỂN THỊ TABLE STATUS WHERE 'Name' = 'table_name') không hoạt động –

+0

Nhưng bằng ngôn ngữ nào? –

+0

java bằng JDBC. Tôi muốn chỉ nhận giá trị như kết quả trong một ResultSet. –

0

Không có cách nào để đảm bảo những gì giá trị mà bạn sẽ nhận được trước khi chèn hàng. Điều này chủ yếu là vì bạn sẽ phải khóa toàn bộ bảng để đảm bảo không có chủ đề nào khác thực hiện chèn bằng giá trị tiếp theo "của bạn".

Bạn có thể đặt trước giá trị bằng cách bắt đầu giao dịch, chèn hàng, nhận giá trị và sau đó thực hiện khôi phục. Sau đó, bạn có thể sử dụng một cách an toàn giá trị đó.

Sẽ đơn giản hơn nhiều khi chỉ chèn hàng, vì vậy có thể tôi không hiểu mục đích của những gì bạn đang làm.

+0

Tôi muốn thực hiện truy vấn chèn vào bảng khác, kiểm tra xem nó có hợp lệ không, và chỉ sau đó chèn vào bảng này. –

+0

Cách tốt nhất để làm điều đó sẽ là một giao dịch.Nếu bạn đang sử dụng MyISAM thì tốt nhất tôi có thể nghĩ là chèn hàng, lấy giá trị autoincrement, , nếu nó không xóa hàng. – Vatev

1

Nếu tôi hiểu đúng, bạn có thể sử dụng số hàng như chỉ số:

SELECT TABLE_ROWS+1 
FROM information_schema.tables 
WHERE table_name='tableName' 
AND table_schema = DATABASE(); 
Các vấn đề liên quan