この場合の恒久的な解決策
この問題を完全に回避するには、データ型text
またはvarchar
/character varying
の代わりに長さ指定子を使用しcharacter varying(n)
ます。マニュアルでこれらのデータ型についてお読みください。
CREATE TABLE monkey(name text NOT NULL)
本当に最大長を適用したい場合は、CHECK
制約を作成します。
ALTER TABLE monkey
ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);
ビューなどの依存オブジェクトに触れることなく、またタイプの変更のためにPostgresにテーブルに新しい行を書き込むように強制することなく、いつでもその制約を変更または削除できます(Postgresの最新バージョンでは必ずしも必要ではありません)。
詳細な説明
@Michaelによって提案されたように、私はいくつかのより一般的な情報を追加します:
PostgreSQLのビューは、単なる「サブクエリのエイリアス」ではありません。ビューは、ルールを持つ特別なテーブルとして実装されON SELECT TO my_view DO INSTEAD
ます。(そのため、コマンドを使用してビューを変更できますALTER TABLE
。)GRANT
特権を付与したり、コメントを追加したり、列のデフォルトを定義したりすることもできます(ルールに役立ちますON INSERT TO my_view DO INSTEAD...
)。詳細については、こちらまたはこちらのマニュアルをご覧ください。
基になるオブジェクトを変更する場合は、依存するビューの定義クエリも変更する必要があります。ステートメントは、ビューのALTER VIEW
補助属性のみを変更できます。クエリを変更するために使用CREATE OR REPLACE VIEW
します-追加の属性を保持します。
ただし、結果の列のデータ型を変更する場合(手元の場合のように)、CREATE OR REPLACE VIEW
は不可能です。あなたはDROP
古いものとCREATE
新しいものを見る必要があります。これにより、基になるテーブルのデータが削除されることはありません。ただし、ビューの追加の属性はすべて削除されますが、これらも再作成する必要があります。