serial # (primary key, auto increment)
2 つのフィールドを持つ mysql データベース テーブルを作成しました。version.
私がやりたいことは、このデータベースに挿入するたびに、version
値を 1 に設定し、次に 2、3、4、5 に設定してから、再び 1 に戻すことです。
挿入を行う前にテーブルの最後のエントリを引き出すことでこれを行うことを想像できます。これどうやってするの?もっと簡単な方法はありますか?私はPHPを使用しています。
組み込みの MySQL トリガーを使用できます: http://dev.mysql.com/doc/refman/5.0/en/triggers.html
データベーストリガーを作成して、必要なことを実行できます。構文は次のようなものです。
CREATE
TRIGGER `event_name` BEFORE/AFTER INSERT/UPDATE/DELETE
ON `database`.`table`
FOR EACH ROW BEGIN
-- trigger body
-- this code is applied to every
-- inserted/updated/deleted row
END;
編集:
トリガーは、データベース側で直接作成されます。MySQL CLI または PHPMyAdmin を使用して接続し、クエリを実行できます。
また、怠惰な解決策は、aaaaaa123456789 が提案したものと同様のクエリを使用することです。
SELECT (
(SELECT version FROM <table name here> ORDER BY id DESC LIMIT 0, 1) % 5
) + 1 as version;
モジュロ (%) 演算子は、2 つの数値の除算の残りを返し、増分を制限するために使用できます。
元。:
1 % 5 = 1
2 % 5 = 2
3 % 5 = 3
5 % 5 = 0
7 % 5 = 2
10 % 5 = 0
PS .: 私はこのクエリを試していません。なぜなら、私は自分の開発マシンを使用していないからですが、私の考えでは動作します。
最も簡単な方法は、rcdmk が提案したように、バージョン フィールドを対応する値で更新するトリガーをデータベース自体に書き込むことです。
何らかの理由でトリガーがウィンドウの外にある場合はSELECT version FROM <table name here> ORDER BY id DESC LIMIT 0, 1
、最後の値を取得するだけで済みます。実際、それを括弧で囲んで (括弧で囲んで)挿入値としてクエリに送信1 + (query here)
するのが、競合状態を回避できるため、おそらく最良の方法です。INSERT
$next_increment = 0;
$qShowStatus = "SHOW TABLE STATUS LIKE 'yourtable'";
$qShowStatusResult = mysql_query($qShowStatus) or die ( "Query failed: " . mysql_error() . "<br/>" . $qShowStatus );
$row = mysql_fetch_assoc($qShowStatusResult);
$next_increment = $row['Auto_increment'];