1

データ移行スクリプトを作成していて、列の一部を変更したい場合、一般的な (そして一見唯一の) 方法は、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. 列の 1 つの側面/属性を変更するための構文はありますか? また ...
  2. SQL自体に列定義を読み取り、1つの側面を変更してから再宣言する方法はありますか?
4

0 に答える 0