2011-12-15 13 views
3

タイトルが正確ではありませんが、残念ですが、タイトルで自分の問題を説明する方法がわかりませんでした。あなたはid_client +他のすべてを取得することができ、複数の主キーコンパウンド制約を持つmysqlテーブル

予約特定の日+部屋のために

day 
    room 
    id_client 
    [other_stuff] 

だから基本的に、私はそのような表を作成したいです。 id_client + dayの場合は、部屋+その他のものを手に入れることができます。

複合日+部屋は一意でなければならず、複合日+ id_clientも一意でなければならないとはどういうことを正確には理解できません。私は本当に私のデータベースの両方の制約が必要です。

誰でもアイデアはありますか?

ありがとうございました。

+0

が重複する可能性[私はMySQLでの化合物の一意性を強制するにはどうすればよいです?]( http://stackoverflow.com/questions/1059265/how-can-i-enforce-compound-uniqueness-in-mysql) –

答えて

4

UNIQUEキーとして1つの組み合わせPRIMARY KEYおよびその他の定義:

CREATE TABLE reservation 
( day 
, room 
, id_client 
, [other_stuff] 
, PRIMARY KEY (day, room) 
, UNIQUE KEY (id_client, day) 
) ; 

または他の方法で回避:

CREATE TABLE reservation 
( day 
, room 
, id_client 
, [other_stuff] 
, PRIMARY KEY (id_client, day) 
, UNIQUE KEY (day, room) 
) ; 

それとも、あなたはすでに別の主キーを持っている場合は、作ります両方ともユニークです:

CREATE TABLE reservation 
( reservation_id 
, day 
, room 
, id_client 
, [other_stuff] 
, PRIMARY KEY (reservation_id) 
, UNIQUE KEY (id_client, day) 
, UNIQUE KEY (day, room) 
) ; 
+0

最後の1つは私の選択であり、他のものがいくつかのフィールド以上のものであれば、それ以上のものを追加することによる影響を軽減するために、別のテーブルを用意してください。 –

1
-- in MySQL 

drop database if exists mydatabase; 
create database mydatabase; 

use mydatabase; 

drop table if exists client; 
create table client 
(
    id int unsigned not null auto_increment, 
    name varchar(45) not null, 
    primary key (id) 
)engine=InnoDB default charset=utf8; 


drop table if exists room; 
create table room 
(
    id int unsigned not null auto_increment, 
    label varchar(45) not null, 
    primary key (id) 
)engine=InnoDB default charset=utf8; 



drop table if exists reservation; 
create table reservation 
(
    id int unsigned not null auto_increment, 
    id_room int unsigned, 
    id_client int unsigned, 
    day date, 
    unique(day, id_room), 
    unique(day, id_client), 
    foreign key (id_room) references room(id), 
    foreign key (id_client) references client(id), 
    primary key (id) 
)engine=InnoDB default charset=utf8; 
+0

Lolは、同様のソリューションを投稿している最中で、これが私の推奨するスキーマ設計になります。 –

0

これを見るには2通りの方法があります。相互に排他的な言い回しの一意の制約はありますか?意味は、他のものなしで存在することができますか?

ロジックは、クライアントに関係なく、一度に1日に予約できることを論理的に指示します。複数のクライアントが同じ部屋を共有することができない限り。だから私はあなたに2つの選択肢を与えます。

# If room can be booked to multiple clients 
CREATE TABLE `reservation` (
    `id` int(11) unsigned not null auto_increment, 
    `day` varchar(25) not null, 
    `room` int(5) unsigned not null, 
    `id_client` int(11) unsigned not null, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY (`room`, `day`), 
    UNIQUE KEY (`room`, `id_client`), 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

# Room can only be booked to one client for a given day 
CREATE TABLE `reservation` (
    `id` int(11) unsigned not null auto_increment, 
    `day` varchar(25) not null, 
    `room` int(5) unsigned not null, 
    `id_client` int(11) unsigned not null, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY (`room`, `day`) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

また、私はそうでない場合は、あなたの更新は、たとえば、より複雑になり、別の主キー列を使用します。

UPDATE `reservation` SET `other_stuff` = 'some value' WHERE `day` = 'Friday' AND `room` = 123; 

# Vs 

UPDATE `reservation` SET `other_stuff` = 'some value' WHERE `id` = 1; 
関連する問題