私は "親テーブル"とパーティションテーブルをたくさんのカラムで作成していますが、今度はカラムをVARCHAR(32)
からTEXT
に変更する必要があります。ロックテーブルなしでPostgreSQLのVARCHARをTEXTに変更
私は親を変更するので、すべてのパーティションも変更されます。
しかし、テーブルにはこの列に2つのユニークなインデックスと1つのインデックスがあります。また、この1
ALTER TABLE my_schema.my_table
ALTER COLUMN column_need_change TYPE VARCHAR(64) USING
column_need_change :: VARCHAR(64);
:私はこのソリューションを参照してください
ALTER TABLE my_schema.my_table
ALTER COLUMN column_need_change TYPE TEXT USING column_need_change :: TEXT;
:
このクエリは、テーブルロック
UPDATE pg_attribute SET atttypmod = 64+4
WHERE attrelid = 'my_schema.my_table'::regclass
AND attname = 'column_need_change ';
をしかし、私は、このソリューションを嫌います。
どのように変更することができますVARCHAR(32)
タイプにTEXT
ロックテーブルなしで、私は更新の間にテーブル内のいくつかのデータをプッシュし続ける必要があります。
私のPostgreSQLのバージョン:9.6
EDIT:クエリが間に私のテーブルロック
ALTER TABLE my_schema.my_table
ALTER COLUMN column_need_change TYPE TEXT USING column_need_change :: TEXT;
:
これは私が取るソリューションである2.6百万人の行に対して1メートル52Sの548msをしかし、それは大丈夫です。
私が間違っていると誰かが私に修正してください!)varcharフィールドの長さ制限は事実上許容される値の制約であり、列はディスクに格納されます。他のほとんどのDBMSでは、最初の指定された制限のために十分な空き容量があるだけで、行がディスク上に配置されるため、その長さを増やすと*表の書き換えが必要になります。 – IMSoP
あなたはPostgreSQLに関する限りです(他のDBMSについてはわかりません)。 –
@IMSoP:OracleとSQL Serverは、変更が "互換性がある"場合(例: 'varchar(20)'から 'varchar(500)'へ –