簡體   English   中英

具有多個主鍵復合約束的mysql表

[英]mysql table with multiple primary key compound constraint

如果標題不完全有用,我很抱歉,但我不知道如何在標題中解釋我的問題。

所以基本上,我想創建一個這樣的表:

保留

   day
   room
   id_client
   [other_stuff]

對於給定的一天+房間,您可以獲得id_client +其他所有內容。 而且對於給定的id_client +日,您可以獲得房間+其他東西。

我不明白我怎么說復合日+房間必須是唯一的,復合日+ id_client也必須是唯一的。 我真的需要在我的數據庫中使用這兩個約束。

有人有想法嗎?

謝謝。

將一個組合定義為PRIMARY KEY ,將另一個組合定義為UNIQUE鍵:

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)
) ;
-- 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;

有兩種看待這種方式的方法......你提到的獨特限制是否相互排斥? 意思是,一個人可以不存在嗎?

邏輯規定,無論客戶如何,房間都可以一次預訂一天。 除非多個客戶可以共享同一個房間。 所以我會給你兩個選擇。

# 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM