1. ホーム
  2. sql

[解決済み] Postgresql - varcharカラムのサイズを小さく変更する

2022-04-19 09:17:09

質問

について質問があります。 ALTER TABLE コマンドを、非常に大きなテーブル (約 3,000 万行) 上で使用することができます。 そのカラムのひとつは varchar(255) にリサイズしたい。 varchar(40) . 基本的には、以下のコマンドを実行して、カラムを変更したいと思います。

ALTER TABLE mytable ALTER COLUMN mycolumn TYPE varchar(40);

処理が長くても問題ないのですが、テーブルが読めなくなるのは ALTER TABLE コマンドを使用します。 もっとスマートな方法はないでしょうか?新しいカラムを追加し、古いカラムから値をコピーし、古いカラムを削除し、最後に新しいカラムの名前を変更するとか?

注意 PostgreSQL 9.0を使用しています。

解決方法は?

にやり方が書いてあります。 PostgreSQL のテーブルで、データを変更せずに列のサイズを変更する . データベースのカタログデータをハックする必要があります。 公式にこれを行うにはALTER TABLEを使用するしかありませんが、ご指摘の通り、この変更は実行中にテーブル全体をロックして書き換えてしまうことになります。

を必ず読んでください。 文字の種類 のセクションを参照してください。 ここでは、さまざまな奇妙なケースに注意する必要があります。 長さのチェックは、値が行に格納されるときに行われます。 下限を設定しても、既存の値のサイズを小さくすることはできません。 変更後、テーブル全体をスキャンして、フィールドの長さが >40 文字の行を探すのが賢明でしょう。 なぜなら、誰かがその行の何かを更新しようとすると、その行の新しいバージョンを保存しようとする時点で、大きすぎるとして拒否されるからです。 ユーザは大喜びです。

VARCHARは、PostgreSQLに存在する、標準SQLの関連する恐ろしい部分に準拠するためだけに存在する恐ろしい型です。 複数データベースの互換性を気にしないのであれば、データをTEXTとして格納し、その長さを制限する制約を追加することを検討してください。 制約を使用すれば、テーブルロックやリライトの問題なしに変更することができますし、弱い長さのチェックだけでなく、より多くの整合性チェックを行うことができます。