[解決済み] Postgresql - varcharカラムのサイズを小さく変更する
質問
について質問があります。
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として格納し、その長さを制限する制約を追加することを検討してください。 制約を使用すれば、テーブルロックやリライトの問題なしに変更することができますし、弱い長さのチェックだけでなく、より多くの整合性チェックを行うことができます。
関連
-
[解決済み] SQLのカラム名があいまいな場合のクエリエラー
-
[解決済み] varcharとnvarcharの違いは何ですか?
-
[解決済み] PostgreSQLのユーザーパスワードを変更する方法を教えてください。
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Server における DateTime2 と DateTime の比較
-
[解決済み] SQL Serverにおけるchar、nchar、varchar、nvarcharの違いは何ですか?
-
[解決済み] SQL Serverで結果をページ分割する最も良い方法は何ですか?
-
[解決済み] Selectステートメントで特定のフィールドの重複を検索する
-
[解決済み] SQL Serverで、1つのALTER TABLEステートメントで複数のカラムをDROPする方法は?
-
[解決済み】varcharカラムの最大長を変更する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] LINQでInclude()は何をするのですか?
-
[解決済み] SQLのSELECTでIF...THENを実行するにはどうすればよいですか?
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] SQLのIN句をパラメータ化する
-
[解決済み] textとvarcharの違い(character varying)
-
[解決済み] SQL Server の CASE ステートメントで OR がサポートされていない。
-
[解決済み] 既存のカラムにIDを追加する
-
[解決済み] Count()で条件を指定することは可能ですか?
-
[解決済み] SQLサーバーで行を列に効率的に変換する
-
[解決済み] SQL Serverで、ある日付より大きいすべての日付を照会するにはどうすればよいですか?