2016-08-23 2 views
0

は私があるテーブルを持っています。 "id"が増加しています...ここでは悪いID要求です。ここでギャップ

ERROR: null value in column "id" violates not-null constraint 
DETAIL: Failing row contains (null, 9921455867, mg123209, name, surname, , [email protected], Company Name, Title Of Person, 123asd). 
********** Error ********** 

私のテーブルの結果です。

1;"1234477867";"qweff";"Name";"Surname";"''";"[email protected]";"Company";"Title";"qwer1234" 
4;"5466477868";"1235dsf";"Name";"Surname";"''";"[email protected]";"Company";"Title";"qwer1235" 
6;"5051377828";"asd123";"Name";"Surname";"''";"[email protected]";"Company";"Title";"qwesr1235" 

私は1,2,3.のように注文したい、私はこの問題を解決することができますどのように私を助けてください。順次です。

+2

これはシーケンスの仕組みです。生成された主キー値の隙間には何も問題はありません。あなたがする必要があることは何もありません、すべてが問題ありません。 –

+0

なぜ 'SERIAL'を使わないのですか? http://stackoverflow.com/questions/787722/postgresql-autoincrement – HoneyBadger

+2

@HoneyBadger: 'シリアル'は**まったく同じことを行います** –

答えて

1

これは方法ですsequencesです。

重要:同じシーケンスから 番号を取得する同時実行トランザクションをブロックしないようにするには、NEXTVAL操作が バック圧延されることはありません。つまり、値がフェッチされると、使用されたとみなされ、 は再び返されません。これは、周囲の トランザクションが後で中止された場合、または呼び出し元のクエリが の値を使用しない場合でも発生します。

コメントに指摘されているように、シーケンスにギャップがないことには問題ありません。テーブル内のいくつかの行を削除してプライマリキーの値にギャップを作成する理由が何であっても、通常はそれらをリセットしてシーケンシャルにするのは面倒ではありません。

ギャップレスシーケンスの作成をお勧めする場合は、次の記事をお読みください:http://www.varlena.com/GeneralBits/130.phpと遅い挿入用に準備してください。

1

このタイプの人為的な主キーを生成するときは、主キーの値に意味がないことを明確に理解することが重要です。その点をもう一度強調する - 鍵の価値意味なし、開発者、管理者、またはユーザーによって帰属される "意味"は間違っている。これはユニークで、ヌルでなく、変わらない価値です。それだけです。それは何であるかは関係ありません。テーブル内の他のキーと比較して「順序付け」されているかどうかは関係ありません。これらの価値を秩序あるものにする必要があるとか、増やす必要がある、あるいは他の何らかの形で「どのように見えるべきか」といういくつかの外部の期待に従わなければならないと信じるという罠に陥らないでください。

ユニークです。 nullではありません。変わらない。それはあなたが知っているすべてであり、あなたが知る必要があるすべてです。

幸運のベスト。

+0

'人工主キー' = '代理キー' – MatBailie

関連する問題