すべてのテーブルには、システムによって暗黙的に定義されたシステム列がいくつかあります。 そのため、システム列の名前はユーザ定義列の名前として使うことはできません。 (これらの制約は名前がキーワードであるかどうかとは関係ありません。つまり、名前を引用符で囲んでもこの制約を回避することはできません。) システム列についてあまり意識する必要はなく、これらが存在することを知っていれば十分です。
行のオブジェクト識別子(オブジェクトID)。 これは PostgreSQL がすべてのテーブル行 (OID を生成させない WITHOUT OIDS をつけてテーブルを作成した場合を除き) に自動的に付与する連番の数です。 この列の型は oid (列名と同じ) です。この型についての詳細は Section 5.10 を参照してください。
この行を含むテーブルの OID です。この属性は特に、継承階層からの SELECT 文では便利です。 この属性がないと、どのテーブルからその行が来たのかわかりにくいからです。 tableoid はテーブル名を得るために pg_class の oid 列に結合することができます。
このタプルの挿入トランザクションの識別情報(トランザクション ID)です (注: このコンテキストにおいては、タプルは行の個別の状態です。行のそれぞれの UPDATE は同じ論理行のための新しいタプルを作ります)。
挿入トランザクション内の(0 から始まる)コマンド識別子です。
削除トランザクションの識別情報(トランザクション ID)です。 削除されていないタプルでは 0(ゼロ)です。可視のタプルでこのフィールドが非ゼロの場合があります。 これは通常、削除トランザクションがまだコミットされていないこと、または、削除の試行がロールバックされたことを意味しています。
削除トランザクション内のコマンド識別子、もしくは 0(ゼロ)です。
テーブル内におけるタプルの物理的位置を表します。ctid はタプルをすばやく見つけるために使うことができますが、行のctidは更新されるたびに、あるいはVACUUM FULL で移動させられるたびに変わります。したがって、ctidは長期の行識別子としては使えません。論理行を識別するためには、OID、あるいはさらによいのはユーザ定義の通番数、を使うべきです。