データ移行スクリプトを作成していて、列の一部を変更したい場合、一般的な (そして一見唯一の) 方法は、ALTER TABLE CHANGE COLUMN ...
ステートメントを作成することです。ただし、これには、列の定義全体を書き直す必要があります。
過去に、これに関していくつかのバージョン管理の問題がありました。説明のために、次の既存のテーブルがあるとします。
CREATE TABLE Book (id INT, type VARCHAR(25) DEFAULT 'Hardcover');
問題の 1 つは、誰かが移行を記述し、フィールドの 1 つの側面を変更し、次のようにすべての属性を再宣言するのを忘れている場合です。
ALTER TABLE Book CHANGE COLUMN type type VARCHAR(30);
-- Opps, just deleted the DEFAULT 'Hardcover' attribute
また、次のように 2 つの移行が互いに干渉する場合もあります。
-- Bob and Joe both get the latest db schema
-- Joe checks in this migration to increase the char length from 25 to 50:
ALTER TABLE CHANGE COLUMN type type VARCHAR(50) DEFAULT 'Hardcover';
-- Without noticing Joe's change, Bob checks in this migration to add NOT NULL:
ALTER TABLE CHANGE COLUMN type type VARCHAR(25) DEFAULT 'Hardcover' NOT NULL;
-- Opps, Bob just clobberd Joe's change of char length
一度にすべてを再宣言せずに、データ型、null 可能性、デフォルト値、文字セットなど、フィールドの 1 つの属性のみを変更する方法があれば理想的です。これにより、ほとんどの場合、上記の問題の両方が軽減されます。
私はどちらかを考えています:
- 列の 1 つの側面/属性を変更するための構文はありますか? また ...
- SQL自体に列定義を読み取り、1つの側面を変更してから再宣言する方法はありますか?