django もだけど RoR とか CakePHP とか有名どころの Web フレームワークは複合ユニークキーを許可していない。
(無理やり使う方法自体はあるのかもだが)
今回もともと複合ユニークキーを使っているデータベースを使っているシステムを移行することを考えていて、さて、どうしたものかと思っていた。新しいバージョンに対応するためにどうせデータベースのいくつかのテーブルにフィールドを追加する必要があるとかで、じゃあ、複合ユニークキーを使わないようにすれば良い、ということになった。
「複合ユニークキー」→「サロゲートキー」+「複合ユニーク制約」
の変換。
field_A と field_B が複合キーだったとしたら
Model の記述でたとえば
ためしに
でテーブル作成用 SQL を書き出してみると(エンジンは MySQL)
という風になる。
(無理やり使う方法自体はあるのかもだが)
今回もともと複合ユニークキーを使っているデータベースを使っているシステムを移行することを考えていて、さて、どうしたものかと思っていた。新しいバージョンに対応するためにどうせデータベースのいくつかのテーブルにフィールドを追加する必要があるとかで、じゃあ、複合ユニークキーを使わないようにすれば良い、ということになった。
「複合ユニークキー」→「サロゲートキー」+「複合ユニーク制約」
の変換。
field_A と field_B が複合キーだったとしたら
Model の記述でたとえば
class NewTable(models.Model):
filed_A = models.IntegerField()
filed_B = models.IntegerField()
filed_C = models.IntegerField()
filed_D = models.TextField()
filed_E = models.CharField(max_length=20)
class Meta:
unique_together=(("filed_A","filed_B"))
ためしに
$ python manage.py sql AppName
でテーブル作成用 SQL を書き出してみると(エンジンは MySQL)
CREATE TABLE `appname_newtable` (
`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
`filed_A` integer NOT NULL,
`filed_B` integer NOT NULL,
`filed_C` integer NOT NULL,
`filed_D` longtext NOT NULL,
`filed_E` varchar(20) NOT NULL,
UNIQUE (`filed_A`, `filed_B`)
)
という風になる。