列とは、与えられたテーブルのユーザ定義の列、もしくは下記のシステム定義の列のいずれかです。
行のオブジェクト識別子(オブジェクトID)。これは PostgreSQL がすべてのテーブル行(OID を生成させない WITHOUT OIDS をつけてテーブルを作成した場合を除き)に自動的に付与する連番の数です。
この行を含むテーブルの OID です。この属性は特に、継承階層からの SELECT 文では便利です。この属性がないと、どのテーブルからその行が来たのかわかりにくいからです。tableoid はテーブル名を得るために pg_class の oid 列に結合することができます。
このタプルの挿入トランザクションの識別情報(トランザクション ID)です(注:タプルは行の個別の状態です。行のそれぞれのUPDATE は同じ論理行のための新しいタプルを作ります)。
挿入トランザクション内の(0 から始まる)コマンド識別子です。
削除トランザクションの識別情報(トランザクション ID)です。削除されていないタプルでは 0(ゼロ)です。可視のタプルでこのフィールドが非ゼロの場合があります。これは通常、削除トランザクションがまだコミットされていないこと、または、削除の試行がロールバックされたことを意味しています。
削除トランザクション内のコマンド識別子、もしくは 0(ゼロ)です。
そのテーブル内のタプルのタプル ID です。これは組(ブロック数、ブロック内のタプルインデックス)でタプルの物理的位置を識別します。ctid はタプルをすばやく見つけるために使うことができますが、行のctid は更新されるたびに、あるいはVACUUM FULL で移動させられるたびに変わります。したがって、ctidは長期の行識別子としては使えません。論理行を識別するためには、OID、あるいはさらによいのはユーザ定義の通番数、を使うべきです。
OID は 32 ビット長であり、クラスタ全体で 1 つのカウンタから割り当てられます。巨大な、または、長期間運用しているデータベースでは、カウンタが一周する可能性があります。従って、OID が一意であることを前提とすることは、OID を一意にすることを保証する手段を講じていない限り非現実的です。OID を使用して行の識別を行う推奨方法は、その OID が使用される各テーブルの OID 列に一意性制約を作成することです。テーブルを跨いで OID の一意性を前提としてはいけません。もしデータベース全体の識別子を必要とするのであれば、 tableoid と 行 OID の組み合わせを使用して下さい。(PostgreSQL の将来のリリースではテーブル毎に OID カウンタを分割する予定です。そのため、 tableoid は全体的な一意的識別子になるように含められる必要があります。)
トランザクション識別子は 32 ビット長です。長期間運用されているデータベースでは、トランザクション ID が一周する可能性があります。これは適切な保守手順を行うことで致命的な問題にはなりません。詳細は 管理者ガイド を参照して下さい。しかし、長期間(100 万トランザクション以上)に渡って、トランザクション識別子の一意性に依存することは良い方法とはいえません。
コマンド識別子も 32 ビット長です。これにより、1 つのトランザクション内の SQL コマンド数の上限 232(400万)が発生します。実際にはこの制限は問題にはなりません。これが 処理タプル数ではなく SQL 問い合わせ数に関する制限であることに注意して下さい。