運用中のデータベースで、1レコードを複数のレコードに分割するようなテーブル定義をする必要があったので、備忘録的にメモします。
やりたいこと
例としてこんなテーブル定義(Score)があったとします。
もとは1レコードに国語と算数の得点が入っていましたが、各科目ごとにレコードを作るように変更する要求がありました。
なので前のデータを保ったまま、新定義(NewScore)に移行することを目的にします。
方針
全体的な方針としては、一度別のテーブルを作成&レコードの移行した後、名前をもとのテーブル名に付け替えます。
以下の順に行います。
- 新定義のテーブルを作成
- 旧テーブルのレコードを新テーブルに移行
- 旧定義のテーブルを削除
- 新定義のテーブル名を変更
2.のレコードの移行ですが、INSERTは別のテーブルのデータを挿入することもできるので、それで行います。(参考)
以下サンプルです。
旧定義のテーブルの作成などは省略。
-- 新定義のテーブルを作成 ここのテーブル名はあとで付け替えるので適当でもOK
CREATE TABLE NewScore(
StudentId int,
Subject varchar(20),
Score smallint,
primary key(joiny, id));
-- 旧テーブルのレコードを新テーブルに移行
-- まずは国語のデータ移行
INSERT INTO NewScore(
StudentId,
'Japanese',
JapaneseScore)
SELECT StudentId, JapaneseScore FROM Score;
-- 次は算数のデータ移行
INSERT INTO NewScore(
StudentId,
'Mathmatic',
MathmaticScore)
SELECT StudentId, MathmaticScore FROM Score;
-- 旧定義のテーブル削除
DROP TABLE Score;
-- 新定義のテーブル名をもともとのテーブル名に付け替え
ALTER TABLE NewScore RENAME TO Score;
これでテーブル定義を更新し、レコードを新定義に合わせて登録できます。