[解決済み] PostgreSQL: シリアルとアイデンティティ
質問
テーブルの主キーに整数の自動採番を行うには、以下のようにします。
SERIAL
しかし、私はこのテーブルの
information_schema.columns
にはいくつもの
identity_
フィールドがあり、実際に
を持つカラムを作成します。
GENERATED
指定子
...
この違いは何ですか? 異なるPostgreSQLのバージョンで導入されたのですか?どちらかが優先されるのでしょうか?
どのように解決するのですか?
serial
は、古くからPostgresの一部であった、自動生成される一意な値の古い実装です。しかし、これは標準SQLの一部ではありません。
標準SQLに準拠するために、Postgres 10では、以下の構文が導入されました。
generated as identity
.
基礎となる実装はまだシーケンスに基づいていますが、定義は標準SQLに準拠するようになりました。この新しい構文が可能にすることの1つは、値の偶発的なオーバーライドを防止することです。
以下のテーブルを考えてみましょう。
create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);
これで実行すると
insert into t1 (id) values (1);
基礎となるシーケンスとテーブルの値は、もはや同期していません。もし、別の
insert into t1 default_values;
最初の挿入でシーケンスが進まなかったため、エラーが発生し、今度は値を挿入しようとします。
1
を再度挿入しようとするため、エラーが発生します。
しかし、2番目のテーブルで。
insert into t2 (id) values (1);
の結果。
ERROR: cannot insert into column "id" Detail: Column "id" is an identity column defined as GENERATED ALWAYS.
そのため、誤ってシーケンスの使用法を忘れてしまうことがあります。この場合でも
override system value
オプションを使って強制することができます。
insert into t2 (id) overriding system value values (1);
のように、テーブルの値と同期していない配列が残りますが、少なくともあなたはそのことを認識しました。
推奨 を使用することをお勧めします。
関連
-
[解決済み] Psql はサーバーに接続できませんでした。そのようなファイルまたはディレクトリがありません、5432エラー?
-
[解決済み] PostgreSQLの場合。PostgreSQLのテーブルを表示する
-
[解決済み] PostgreSQLの "DESCRIBE TABLE"
-
[解決済み] PostgreSQL コマンドラインユーティリティ: psql を終了する方法
-
[解決済み] PostgreSQLのユーザーパスワードを変更する方法を教えてください。
-
[解決済み] どのバージョンのPostgreSQLを使用していますか?
-
[解決済み】Mac OS XでPostgreSQLサーバーを起動するには?
-
[解決済み】PostgreSQLで主キーの自動インクリメントを設定する方法は?
-
[解決済み】PostgreSQLで行が存在するかどうかを最速でチェックする方法
-
[解決済み] PostgreSQLでソートしながら固定数の行を削除するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
PostgresqlのデータベーステーブルのデータをExcel形式にエクスポートする方法(推奨)
-
Postgresqlのセルフインクリメントidをキーにした場合の重複問題の解決
-
Postgresqlのデータベースにおける配列の作成と変更に関する操作
-
[解決済み] psqlでデータベースを切り替えるには?
-
[解決済み] PostgreSQL 自動インクリメント
-
[解決済み] psql'に非対話的にパスワードを指定するには?
-
[解決済み] Postgresqlで「大文字小文字を区別しない」クエリを作成する方法は?
-
[解決済み] Postgres / PostgreSQLのテーブルとインデックスのディスクサイズはどのように見つけるのですか?
-
[解決済み] Postgresの場合。1つのカラムだけ区別される
-
[解決済み] Postgresデータベースのエンコーディングの取得