2011-11-22 11 views
5

MySQL + PHPでは、INT値を増やして1つのクエリ内で新しい値を返すことは可能ですか?INT値+ 1を更新して新しい値を返すことはできますか?

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

$updated_number = ??? 

または別のクエリを投稿する必要がありますか?

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

おそらくストアドプロシージャが役に立ちます。 –

+0

私は、ストアドプロシージャは、インクリメントに続くselectが、最初のインクリメントとセレクトの間に別のインクリメントが発生する可能性があるため、順番に並んでいると思います。 – Zikes

+0

または、ストアドプロシージャを使用しないように設定されている場合は、最初に番号を選択し、phpで1を追加してからupdateを実行し、コードが更新された番号を使用していることを確認できるようにします。 –

答えて

7

かんたん回答 - いいえ、できません。

はい、指定したIDの値をインクリメントするストアドプロシージャを使用する場合は、新しい値を取得して返します。

私はただの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 

使用法:

CALL increment(uniqid) 

を複数の同時アクセスが可能な場合は、運転者を確保するために、最初のLOCKにテーブルを望むことができますアトミック性 - MySQLはストアドプロシージャがテーブル自体をロックすることはできません。その後

+0

なぜ新しいdownvote? AFAICSこれはOPが望んでいるものとまったく同じです! – Alnitak

7

いいえあなたは、その行を選択する必要があります。

-1

あなたは

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

を行い、結果を得るためにmysql_next_result()を使用することができます

+2

これは動作しません。単一の照会呼び出しで複数の照会を発行することはできません。 PHPのmysqlドライバでは許可されていません。 –

-2

@luvPlsQLが正しいです。しかし、基本的にデータを最初に取得し、次にそれを増やしてから更新する必要があります。最後に、更新する前に増加した変数を取得して使用できます。

0

手順がありません。セッション変数に新しい値を格納し、次のステートメントから取得できます。

UPDATE table SET番号=(@next_value:= number + 1)WHERE id = 'uniqid';その後、

アリ:

SELECT @next_value。

セッション変数は他の増分の影響を受けません。

関連する問題