2011-05-22 81 views
0

嘿。
首先,我不得不说这是我第一次尝试编写SQL,这意味着我是一个n00b。有一些耐心,请..MySQL不尊重UNIQUE和PRIMARY-KEY

现在,我想创建一个在我的数据库名为“推”像这样的表:

CREATE TABLE push 
(id int NOT NULL AUTO_INCREMENT, 
UDID varchar(40) NOT NULL, 
token varchar(64) NOT NULL, 
lastpost int DEFAULT '0', 
PRIMARY KEY(id), 
UNIQUE KEY(id, UDID, token)); 

这样的作品,但并不如预期。如果我现在尝试在这里插入一些值,像这样:

INSERT INTO push (UDID, token, lastpost) 
VALUES ('123456789abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwqyz123456789', 211); 
INSERT INTO push (UDID, token, lastpost) 
VALUES ('123456789abcdefghijklmnopqrstuvwxyz', 'abcdefghijklmnopqrstuvwqyz123456789', 211); 

那会,在我眼里,导致一个错误,因为UDID和令牌是平等的,但它不只是触发任何错误的话,那插入副本。

我可能错过了这里的东西,但我找不到什么。我怎样才能使这个返回预期的结果?
谢谢。

回答

10

这样的:

UNIQUE KEY(id, UDID, token)); 

意味着那些3的组合应该是唯一的。 id字段(自动递增)将是2行不同,所以这将满足该规则

如果组合应该是唯一的,使其没有id

UNIQUE KEY(UDID, token)); 
+0

我将如何确保双方唯一的UDID和令牌? – Emil 2011-05-22 13:23:52

+2

请勿在UNIQUE键中传入'id'。 – 2011-05-22 13:50:22

2

这里该位

UNIQUE KEY(id, UDID, token)); 

确保您可以随时为UDID输入重复的值,它会被接受作为测试uniqeness包括ID;其定义为auto_increment。从这个键删除ID,你应该有检查你想即

CREATE TABLE push 
(id int NOT NULL AUTO_INCREMENT, 
UDID varchar(40) NOT NULL, 
token varchar(64) NOT NULL, 
lastpost int DEFAULT '0', 
PRIMARY KEY(id), 
UNIQUE KEY(UDID, token)); -- ID now excluded here 
+0

我将如何保证双方和独特的UDID和令牌呢? – Emil 2011-05-22 13:21:14

0

如果你想同时UDIDtoken是唯一的,或者换句话说没有两个UDID应该允许相同也不两个令牌应该被允许是一样的,请尝试:

CREATE TABLE push 
    (id int NOT NULL AUTO_INCREMENT, 
    UDID varchar(40) NOT NULL, 
    token varchar(64) NOT NULL, 
    lastpost int DEFAULT '0', 
    PRIMARY KEY(id), 
    UNIQUE KEY(UDID), 
    UNIQUE KEY(token) 
) ; 
+0

谢谢:) – Emil 2011-05-22 14:32:57