2013-05-02 82 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