0

私はデータベースが初めてです。次のような SQL データベースがあります。

BEGIN;
CREATE TABLE "country" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(255) NOT NULL
)
;
CREATE TABLE "location" (
    "id" integer NOT NULL PRIMARY KEY,
    "name" varchar(255) NOT NULL,
    "coordinate" varchar(255) NOT NULL,
    "country_id" integer NOT NULL REFERENCES "country" ("id")
)
;
CREATE TABLE "item" (
    "id" integer NOT NULL PRIMARY KEY,
    "title" varchar(25) NOT NULL,
    "description" text NOT NULL,
    "date" datetime NOT NULL,
    "source" varchar(255) NOT NULL,
    "link" varchar(255) NOT NULL,
    "location_id" integer NOT NULL REFERENCES "location" ("id")
)
;

データベースから項目エントリを削除してから、新しい項目エントリをデータベースに追加すると、項目の主キーはどうなりますか? つまり、増加するだけですか、それともギャップを埋めるのでしょうか?

私の状況では、データベースに不要なエントリを「active = no」エントリとして保持することはできません。それらを完全に削除する必要がありますが、アイテムの主キーが台無しになるのではないかと心配しています。

4

1 に答える 1

1

実際にギャップレス シーケンスを必要とするアプリケーションは比較的少数です。ギャップレス シーケンスを必要とするアプリケーションのほとんどは、アカウンティングに関係しています。請求書に連続番号が付けられている場合、監査人はそれらすべてを説明したいと考えていますが、ギャップのあるシーケンスではそれを行うことができません。(請求書番号 30445 を作成できない場合、それは置き忘れた、存在しなかった、または誰かが不正な請求書を入力したためですか?)

MySQL だけでなく PostgreSQL だけでなく、SQL データベースでは、dbms が生成するシーケンス (オートインクリメント、シリアル、ビッグシリアル) がギャップレスであることが保証されていません。実際、十分に理解された一般的な条件下では、ギャップが生じることが保証されています。

これらの種類の整数は通常、トランザクション中に生成されます。トランザクションがロールバックされると、その整数は破棄されます。再利用の試みはありません。次に同じテーブルへの INSERT が成功すると、ギャップが生じます。

このようなテーブルから行を削除しても、主キーは台無しになりません。隙間が空くだけです。数もギャップも比較的無意味です。

于 2012-12-02T23:18:01.227 に答える