2013-05-02 79 views
0

INSERT我有一個表創建:MySQL的有兩個不同的UNIQUE約束

CREATE TABLE userSessions (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    userId VARCHAR(50) NOT NULL, 
    startTime TIMESTAMP NULL, 
    endTime TIMESTAMP NULL, 
    PRIMARY KEY (id), 
    INDEX(startTime), 
    INDEX(endTime), 
    UNIQUE(userId, startTime), 
    UNIQUE(userId, endTime) 
); 

而且我想知道,如果插入行具有重複鍵,在其約束是重複的,在開始時間或在endTime上。 有誰知道該怎麼做?

回答

2

名稱的限制:

CREATE TABLE userSessions (
    id INTEGER NOT NULL AUTO_INCREMENT, 
    userId VARCHAR(50) NOT NULL, 
    startTime TIMESTAMP NULL, 
    endTime TIMESTAMP NULL, 
    PRIMARY KEY (id), 
    INDEX(startTime), 
    INDEX(endTime), 
    UNIQUE idxStartTime(userId, startTime), 
    UNIQUE idxEndTime(userId, endTime) 
); 

當插入現在失敗的錯誤顯然是違反狀態,這制約:

#1062 - Duplicate entry 'value' for key 'idxStartTime' 
+1

另外值得一提的是,(據我所知)沒有除解析錯誤消息外(取決於服務器版本,格式可能稍有變化)的其他方式獲取密鑰名稱。 – 2013-05-02 12:22:02

+0

誠然,程序員永遠不需要知道這一點 - 重複時間戳永遠不可能,即使如此,業務邏輯應該在嘗試INSERT查詢之前檢查有效性。 – 2013-05-02 12:26:34

+1

從客戶端強制執行該操作可能涉及鎖定整個表。根據情況它可能是矯枉過正。有一個API來獲取密鑰名稱有它的用法。 – 2013-05-02 12:31:16