2011-11-22 9 views
5

Czy w MySQL + PHP można zwiększyć wartość INT i zwrócić nową wartość w ramach jednego zapytania?Czy mogę zaktualizować wartość INT + 1 i zwrócić nową wartość?

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

$updated_number = ??? 

Czy muszę dodać kolejne zapytanie?

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

być może pomocna byłaby procedura składowana. –

+0

Myślę, że procedura składowana jest w porządku, ponieważ przyrost, po którym następuje zaznaczenie, powoduje możliwość wystąpienia kolejnego przyrostu między początkowym przyrostem a wyborem. – Zikes

+0

Lub jeśli nie ustawiono procedury składowanej, najpierw wybierz numer, a następnie dodaj go do php, a następnie zaktualizuj, aby kod mógł być pewny, że używa numeru, na który został zaktualizowany. –

Odpowiedz

7

Prosta odpowiedź - nie, to niemożliwe.

Dłuższa odpowiedź, tak, jeśli używasz procedury składowanej, która zwiększa wartość dla określonego identyfikatora, pobiera nową wartość i zwraca ją.

Właśnie przetestowane pod 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 

Zastosowanie:

CALL increment(uniqid) 

Jeśli wiele jednoczesnych dostępów są możliwe może chcesz LOCK tabelę pierwszy, aby zapewnić funkcjonowanie na atomicity - MySQL najwyraźniej nie pozwala procedurom przechowywanym na blokowanie samych tabel.

+0

dlaczego nowe głosowanie? AFAICS robi dokładnie to, co chce OP! – Alnitak

7

nr Trzeba będzie wybrać tę linię potem

-1

można zrobić

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

i używać mysql_next_result(), aby uzyskać wyniki.

+2

To nie zadziała. Wielokrotne zapytania nie mogą być wydawane w jednym wywołaniu zapytania. Nie jest to dozwolone przez sterownik mysql PHP. –

-2

@luvPlsQL ma rację. Ale zasadniczo musisz najpierw uzyskać dane, następnie je zwiększyć, a następnie zaktualizować. W końcu otrzymałeś zwiększoną zmienną przed aktualizacją, abyś mógł z niej korzystać.

0

Istnieje droga bez procedury. Możesz zapisać nową wartość w zmiennej sesji i pobrać ją z następnej instrukcji.

UPDATE table SET number = (@nazwa_nazwa: = liczba + 1) WHERE id = 'uniqid';

mrówka wówczas:

SELECT @next_value;

Na twoją zmienną sesji nie mają wpływu inne przyrosty.

Powiązane problemy