2016-03-30 11 views
0

からユーザーのを削除する際にIDの思い出し、私はマイケル・ハートルチュートリアル||データベース

説明でRailsのチュートリアルを以下午前:現在百ユーザーのデータベースでは。私は50個のアカウントをさらに作成し、ユーザーID 101〜150を取得します。その後、管理者はそれらを破棄します。さらに別のアカウントを作成すると、ユーザー101〜150はもう存在しないため、ユーザーID 101を取得する必要があります。しかし、それは151になるので、私のユーザーIDは100から151へと飛び越えます。

この原因は何ですか?アカウントを破壊するのに間違ったことがありますか?ファイルとコンソール出力下記

ビュー:

(app/views/_user.html.erb) 
<li> 
<%= gravatar_for user, size: 50 %> 
<%= link_to user.name, user %> 
<% if current_user.admin? && !current_user?(user) %> 
    | <%= link_to "delete", user, method: :delete, 
          data: { confirm: "You sure?" } %> 
<% end %> 
</li> 

コントローラ:

def destroy 
    User.find(params[:id]).destroy 
    flash[:success] = "User deleted" 
    redirect_to users_url 
end 

コンソール出力ユーザを削除する場合:

Started DELETE "https://stackoverflow.com/users/102" for $IP at 2016-03-30 12:11:52 +0000 
Processing by UsersController#destroy as HTML 
Parameters: {"authenticity_token"=>"Kj+2TnvVk8jVrZi1leVeQRAjJbZsKqXAhA1cjK/WNDa4TieY54NdD6OCATNANFR0lh1trhi+ZzvMLhnirZnw+g==", "id"=>"102"} 
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 102]] 
(0.1ms) begin transaction 
SQL (0.3ms) DELETE FROM "users" WHERE "users"."id" = ? [["id", 102]] 
(10.7ms) commit transaction 
+0

あなたの破壊は確実に機能しますか? – Albin

+0

のIDは一意であるため、一度割り当てられると、データベースを削除して完全に開始しない限り、そのIDに新しいユーザーは存在しません。 – toddmetheny

+0

** "まだ別のアカウントを作成すると、ユーザーID 101を取得する必要があります。" ** - これは間違っています。なぜあなたはそれをどう思いますか?それはしないでください。いくつかのdbエンジンの効率のために、idは非整数であってもよいし、順序付けされていなくても順序付けされていなくてもよい。 'id'フィールドがどのように構築されているか気にする必要はありません。それはそれを気にするdbエンジンの義務です。 – mudasobwa

答えて

0

テーブルID列であります自動増加。 mysqlについては、docを参照してください。レコードを削除しても、データベースを削除したり、Alterテーブルを呼び出したりしない限り、自動インクリメントフィールドは再び使用されません。

孤立関係が誤って割り当てられず、データの不一致が発生する可能性がある理由があります。

+0

"レコードが削除されても自動インクリメントフィールドは再び使用されません" - これは間違っています。 mysqlとpostgresqlを含む、すべての既知の[私に] dbエンジンの_current_ autoincrement値を設定するかもしれません。 – mudasobwa