【问题标题】:ID auto increase but not uniqueID自动增加但不唯一
【发布时间】:2013-12-15 09:18:19
【问题描述】:

我有一个表,我想要一个 id 会自动增加但不是主要或唯一的。

这可能吗?

【问题讨论】:

  • “不是主要的或独特的”是什么意思?
  • 你可以有id, not_uniuqe_id,other keys
  • 我正在记录通话,有些通话有几行历史记录,这意味着同一个通话 (id) 需要几行
  • 如上所述...
  • 让历史成为一个文本字段,并在其中输入任意数量的文本,不限于 1 行

标签: php mysql unique


【解决方案1】:

在这种情况下,你真的应该创建另一个表。

例如

CREATE TABLE `Calls` (
  `Id`     INT(10)      AUTO_INCREMENT,
  `From`   VARCHAR(100) NOT NULL,
  `To`     VARCHAR(100) NOT NULL,

  PRIMARY KEY (`Id`)
) ENGINE=INNODB;

CREATE TABLE `CallHistory` (
  `Id`     INT(15)      AUTO_INCREMENT,
  `CallId` INT(10)      NOT NULL,
  `Text`   VARCHAR(255) NOT NULL,

  PRIMARY KEY (`Id`),
  KEY `CallHistory_Calls_idx` (`CallId`),
  CONSTRAINT `CallHistory_Calls`
    FOREIGN KEY (`CallId`)
    REFERENCES `calls` (`Id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE
) ENGINE=INNODB;

这是 SQLFiddle 上的 a demo

这样做的好处是,如果您从Calls 中删除一行,CallHistory 中的行也将被删除。


运行此查询:

SELECT `Calls`.`Id`,
       `Calls`.`From`,
       `Calls`.`To`,
       `CallHistory`.`Text`

FROM   `Calls`, `CallHistory`
WHERE  `Calls`.`Id` = `CallHistory`.`CallId`;

给出如下结果:

【讨论】:

    【解决方案2】:

    这应该可行:

    id int NOT NULL AUTO_INCREMENT
    

    无论如何,除非您稍后更新现有值,否则我看不出它如何保持唯一性

    【讨论】:

      【解决方案3】:

      是的,你需要设置auto_increment约束:

      CREATE TABLE `test` (
        `testID` int(11) NOT NULL, //primary key here
        `testInc` int(11) NOT NULL AUTO_INCREMENT, //here is your non-primary auto increment column
        PRIMARY KEY (`testID`),
        KEY `testInc` (`testInc`)
      ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
      

      如果您也希望它是唯一的,那么您可以添加唯一约束:

      ALTER TABLE `test` ADD CONSTRAINT ux_unique_constraint UNIQUE `testInc`
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-26
        • 1970-01-01
        • 2016-09-27
        • 2015-10-17
        • 2015-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多