2009-03-04 7 views
2

もちろん、私は結局十分な行を置くと繰り返しがあります。しかし、十分大きなIDフィールドを選択すると仮定しましょう。行が削除されても、mysqlのidは繰り返されないことが保証されていますか?

私はidが時間の経過とともに一意に行を識別することができるかどうかを知りたいと思います。クライアントが私にidを送ってきたら、それが何行を参照しているのか、行が削除されているのかを見極めることができるようにしたいのです(あるいは、それが偽のIDだが、その場合は間違って削除された)。

次も参照してください:私は、データベース、またはバックアップを再起動して復元する場合 - それはそれは左のIDの作成を続行します - であってもよいし、それは「穴を埋める」ことを決定します

答えて

4

をした場合あなたはリセットされない "int not null自動インクリメント主キー"を持っています。そうすればyes IDは再利用されません。

あなたが古いIDを再利用した場合(これはMySQLではデフォルトでは発生しませんが、人的要因は常にカウントされます)、面白い質問が発生します。

データベースが正しく正規化されている場合は、アプリケーションがIDの再利用を処理できるように、がカスケード接続されている必要があります。

編集(あなたの投稿を編集しているので、私は私の答えを肉付けします)、この引用について:「そして、クライアントは私がそれを参照する場合や、何行かを決定することができるようにしたいIDを送信する場合その行は削除されました "。 IDが削除されていない場合(データベースから情報を抽出するために不可欠なもの)、IDがどの行に属しているかを判断することは常に可能です。

しかし IDが指す行が削除された場合、それはそれがないので、それは...属する何行かを決定することはできないです。これが必要な場合は、何らかのタイプの監査機能を実装することをアドバイスします。triggersが好ましいです。

+0

いつリセットすればよいですか?それは私がコマンドでやることか、何かの副作用として起こることができますか? – flybywire

+0

さて、これは起こりそうなことではありませんが、mysqlのさまざまなsqlコマンドで可能です。 – thr

+0

リセットするタイミングが不明な場合は、リセットしないでください。自動的に生成されたIDは、意味のあるものでも再利用可能なものでもありません。 – tehvan

2

現在の自動インクリメント値は、テーブルに付加された余分な属性を介してバックアップ/リストア全体で保持されます。あなたが「=表tableNameのAUTO_INCREMENTをALTER」を使用して、それをリセットすることができ

mysql> create table foo (bar int(11) primary key auto_increment); 
Query OK, 0 rows affected (0.06 sec) 

mysql> insert into foo() values(),(),(),(); 
Query OK, 4 rows affected (0.00 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> show create table foo \G 
*************************** 1. row *************************** 
     Table: foo 
Create Table: CREATE TABLE `foo` (
    `bar` int(11) NOT NULL auto_increment, 
    PRIMARY KEY (`bar`) 
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 
1 row in set (0.00 sec) 

が、それがない場合は、属性値が無視され のように、それは私になります。あなたはENGINE =の後にダンプにそれを見ることができますあなたが挿入を行うときの最大の既存のIDよりも大きい。

0

また、以前に使用されたIDを再使用しないという前述の動作は、MyISAMエンジンに対して有効ですが、実際には使用可能なすべてのエンジンに対して有効ではありません。

関連する問題