5

MySQLのレコードごとに一意のタイムスタンプ値を取得する可能性はありますか??..

サンプルテーブルを作成しました

CREATE TABLE t1 (id int primary key, name varchar(50), 
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );

いくつかのサンプルINSERTIONSを実行しましたが、タイムスタンプ値が重複しているようです。

e.g  insert into t1(id,name) values(1,"test");
4

2 に答える 2

5

近いうちに(5.6.4)、MySQLはTIMESTAMP列に小数秒を提供しますが、理論的には、特にMySQLを単一に制限した場合、それらはほとんどの場合一意であるとはいえ、小数秒でさえ一意であるとは限りません。スレッド。

一時的に並べ替えられる一意の番号が必要な場合は、 UUIDを使用できます。

SELECT UUID()次のようなものが得られます:

45f9b8d6-8f00-11e1-8920-842b2b55ce56

そしてしばらくして:

004b721a-8f01-11e1-8920-842b2b55ce56

UUIDの最初の3つの部分は時間で構成されますが、精度が高いものから低いものの順になっているため、次のように使用SUBSTR()して最初の3つの部分を逆にする必要があります。CONCAT()

SELECT CONCAT(SUBSTR(UUID(), 15, 4), '-', SUBSTR(UUID(), 10, 4),
  '-', SUBSTR(UUID(), 1, 8))

収量:

11e1-8f00-45f9b8d6

明らかに、このような関数をデフォルト値として使用することはできなかったため、コードで設定する必要がありますが、これは時間的に順序付けられた一意の一意の値であることが保証されています。UUID()は秒(クロックサイクル)よりもはるかに低いレベルで動作するため、呼び出しごとに一意であることが保証され、オーバーヘッドが低くなります(auto_incrementのようなロックはありません)。

microtime()データベースサーバーはより集中化されているため、アプリケーションサーバーでのPHPの関数など、同様の関数を使用するよりも、データベースサーバーでUUID()を使用する方が望ましい場合があります。衝突する値を生成する可能性のある複数のアプリケーション(Web)サーバーがある場合でも、microtime()は一意の値を保証しません。

于 2012-04-25T18:16:08.297 に答える
2

1秒間に2つ以上の挿入または編集を行わない場合は、はい。唯一の問題は、1秒間に多くのことを実行できることです。つまり、複数の挿入やwhere句を使用した自動更新です。これにより、一意のタイムスタンプを強制する単純なソリューションが除外されます。列にunique制約を追加しtimestampます。

なぜtimestampユニークでなければならないのですか?auto increment一意のインデックスなどが必要な場合は、他のものを使用してください。

よりも正確な時間値が必要な場合は、以下timestampを参照してください。

于 2012-04-25T17:35:54.760 に答える