2011-11-22 38 views
5

Có thể trong MySQL + PHP để tăng giá trị INT và trả về giá trị mới trong một truy vấn không?Tôi có thể cập nhật giá trị INT + 1 và trả về giá trị mới không?

$sql = mysql_query("UPDATE table SET number=number+1 WHERE id='uniqid'"); 

$updated_number = ??? 

Hoặc tôi cần đăng một truy vấn khác?

SELECT number FROM table WHERE id='uniqid' 
+2

có lẽ quy trình được lưu trữ sẽ hữu ích. –

+0

Tôi nghĩ rằng một thủ tục được lưu trữ theo thứ tự, như là một gia tăng theo sau bởi một lựa chọn mang khả năng tăng thêm có thể xảy ra giữa tăng ban đầu và chọn. – Zikes

+0

Hoặc nếu bạn được thiết lập không sử dụng thủ tục được lưu trữ, hãy chọn số đầu tiên, sau đó thêm một số vào php, sau đó cập nhật để mã có thể chắc chắn rằng nó đang sử dụng số mà nó cập nhật. –

Trả lời

7

Câu trả lời đơn giản - không, điều đó là không thể.

Câu trả lời dài hơn, vâng, nếu bạn sử dụng thủ tục được lưu trữ làm tăng giá trị cho ID được chỉ định, hãy truy lục giá trị mới và trả về giá trị đó.

Tôi vừa thử nghiệm này dưới MySQL 5.1.59:

CREATE PROCEDURE increment (IN uniqid VARCHAR(255)) 
BEGIN 
    UPDATE `table` SET number = number + 1 WHERE id = uniqid; 
    SELECT number FROM `table` WHERE id = uniqid; 
END 

Cách sử dụng:

CALL increment(uniqid) 

Nếu có nhiều truy cập đồng thời có thể xảy ra bạn có thể muốn LOCK bảng đầu tiên để đảm bảo các hoạt động của nguyên tử - MySQL dường như không cho phép các thủ tục lưu trữ tự khóa các bảng.

+0

tại sao downvote mới? AFAICS thực hiện chính xác những gì OP muốn! – Alnitak

7

số Bạn sẽ cần phải chọn dòng sau

-1

bạn có thể làm

status = mysql_query(mysql, 
        "UPDATE table SET number=number+1 WHERE id='uniqid';\ 
         SELECT FROM table WHERE id='uniqid';\ 
        "); 

và sử dụng mysql_next_result() để có được kết quả.

+2

Điều này sẽ không hoạt động. Không thể phát nhiều truy vấn trong một cuộc gọi truy vấn đơn lẻ. Nó không được cho phép bởi trình điều khiển mysql PHP. –

-2

@luvPlsQL là đúng. Nhưng về cơ bản bạn cần lấy dữ liệu trước, tiếp theo tăng nó và sau đó cập nhật. Cuối cùng, bạn có biến tăng trước khi cập nhật để bạn có thể sử dụng nó.

0

Có cách mà không cần thủ tục. Bạn có thể lưu trữ giá trị mới trong biến phiên và lấy nó từ câu lệnh tiếp theo.

CẬP NHẬT table SET number = (@next_value: = number + 1) WHERE id = 'uniqid';

kiến ​​rồi:

SELECT @next_value;

Biến phiên của bạn không bị ảnh hưởng bởi các gia số khác.

Các vấn đề liên quan