2013-07-05 71 views
0

我有以下表設置:複合主鍵其中一個字段是DATETIME數據類型

CREATE TABLE IF NOT EXISTS `appointment` (
    `idappointment` int(11) NOT NULL AUTO_INCREMENT, 
    `appdate` datetime NOT NULL, 
    `appnote` varchar(255) DEFAULT 'Please enter a relevant note', 
    `chair_idchair` int(11) NOT NULL, 
    PRIMARY KEY (`idappointment`,`chair_idchair`), 
    KEY `fk_appointment_chair_idx` (`chair_idchair`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=21 ; 

appdate字段的典型值是: 2013-07-05 08:30:002013-07-05 09:00:00 所以沒有時間戳的值和所有約會不同於固定的時間間隔。

對於我的應用程序需要以確保沒有單個椅子是在相同的時間間隔的雙預訂,爲此我認爲產生由所述appdate字段的複合主鍵和chair_idchair字段,然後設定該複合初級的唯一的關鍵。

我的問題是如何在MySQL中做到這一點,更重要的是,它確實是確保從數據庫方面不能預訂雙重預訂的最佳方法。我不想只依靠應用程序來執行此檢查,因爲用戶將同時從多個位置預訂。

+0

乾杯,只是一個側面說明:「然後設置此複合主鍵唯一」 - 主鍵是唯一的定義。 (只是爲了好奇的谷歌。) –

回答

1

製作一個包含appdatechair_idchair的組合主鍵不會解決問題。如果爲2013-07-05 08:30:00設置了一個條目的更新日期,那麼它將允許具有相同主持人ID的Appdate 2013-07-05 08:31:00的另一個條目,這是不正確的。

爲了克服這個問題,在插入任何條目之前,您需要檢查是否有任何約會的時間與查詢中的當前約會重疊,然後只允許插入。

E.g.如果預約時間爲30分鐘,那麼在插入任何預約之前,您必須檢查是否有時間少於新預約時間30分鐘的同一主席的預約。

TIMEDIFF() mysql的函數可能對你有幫助。

0

正如Darshan指出的那樣,像這樣的複合索引不會在appdate上執行唯一性。 你最好使用自動增量列進行PK。並在appdate上添加另一個索引(必要時唯一)。

這樣就很容易實現,當你的客戶決定你需要在數據庫中有相同appdate的2條記錄時,它也會更容易改變。

如果要執行appdate經由數據庫唯一可以之前插入/更新觸發創建正常化的appdate值( - :30:例如,從2013年7月5日2013-07-05 12:33:41' to 12將其轉換00`)。然後對索引設置一個唯一的約束。

相關問題