【问题标题】:MySQL doesn't respect UNIQUE and PRIMARY-keysMySQL 不尊重 UNIQUE 和 PRIMARY-keys
【发布时间】:2011-08-30 14:18:47
【问题描述】:

嘿。
首先,我不得不说这是我第一次尝试编写 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 和令牌是相等的,但它根本不会触发任何错误,它只是插入重复项。

我可能在这里遗漏了一些东西,但我不知道是什么。我怎样才能使它返回预期的结果?
谢谢。

【问题讨论】:

    标签: php mysql sql duplicates unique


    【解决方案1】:

    这个:

    UNIQUE KEY(id, UDID, token));
    

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

    如果组合应该是唯一的,请不要使用id

    UNIQUE KEY(UDID, token));
    

    【讨论】:

    • 不要在唯一键中传入id
    【解决方案2】:

    这里有点

    UNIQUE KEY(id, UDID, token));
    

    确保您始终可以为 UDID 输入重复值,并且它将被接受,因为唯一性测试包括 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
    

    【讨论】:

      【解决方案3】:

      如果您希望 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 )
        ) ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-23
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 2010-10-17
        • 2011-04-24
        相关资源
        最近更新 更多