MySQL并不尊重UNIQUE和PRIMARY键

时间:2011-05-22 13:15:02

标签: php mysql sql duplicates unique

嘿。
首先,我不得不说这是我第一次尝试编写SQL,这意味着我是一个n00b。请耐心等待..

现在,我正在尝试在我的数据库中创建一个名为“push”的表,如下所示:

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和令牌相同,但它根本不会触发任何错误,只是插入副本。

我可能在这里遗漏了一些东西,但我找不到什么。如何使此返回预期结果?
感谢。

3 个答案:

答案 0 :(得分:10)

这样:

UNIQUE KEY(id, UDID, token));

意味着这三者的组合应该是唯一的。对于2行,id字段(自动递增)将是不同的,因此它将满足该规则

如果组合应该是唯一的,请在没有id

的情况下进行组合
UNIQUE KEY(UDID, token));

答案 1 :(得分: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

答案 2 :(得分: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 )
  ) ;