PostgreSQL : tables can have at most 1600 columns


PostgreSQLで1つのテーブルに定義できるカラム数の上限は、最大1600までです。
これを越えると
ERROR: tables can have at most 1600 columns
というメッセージが出力されてエラーとなります。
普通に使っていればカラム数が1600個もあるテーブルなんて作ることもないので、何ら問題ありません。

しかし、この上限、バッチ処理などで都度ALTER TABLE でカラムを一旦削除して追加を繰り返しても、その分がカウントされてしまうので注意が必要です。
何回かバッチ処理を繰り返しているうちに、ある日突然エラーになってしまうということにもなりかねません。

PostgreSQLの最近のバージョンでは、VACUUM FULL を実行すればカウント数はクリアされるので大きな問題とはなりませんが、以前のバージョンでは VACUUM FULL してもクリアされませんでした。

カラムを一旦削除して、処理が終わってからまたカラムを追加する、といったバッチ処理は、これが原因でエラーになる可能性もあるので止めた方が無難です。

このエラーは以下のようなSQLスクリプトで簡単に確認することが可能です。

・テスト用のテーブル作成

DROP TABLE test;
CREATE TABLE test (
  col text,
  col_add text
)

・カラム数上限1600のエラーを確認するPL/pgSQL関数定義

CREATE OR REPLACE FUNCTION test_func1(INT)
RETURNS INTEGER
AS $$
  DECLARE 
    k ALIAS FOR $1;
    query TEXT;
  BEGIN
    FOR i IN 1..k LOOP
      query := 'ALTER TABLE test DROP COLUMN col_add ';
      EXECUTE query;
      query := 'ALTER TABLE test ADD COLUMN col_add text';
      EXECUTE query;
    END LOOP;
    RETURN 1;
  END;
$$
LANGUAGE 'plpgsql';

以下のSQL分を実行すると、カラム上限のエラーを確認することができます。
select test_func1(1600);

カテゴリー: データベース

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

カテゴリー