【问题标题】:MySQL second auto increment field based on foreign keyMySQL第二个基于外键的自增字段
【发布时间】:2013-11-16 04:33:19
【问题描述】:

我多次遇到这个问题,但还没有找到“MySQL 方法”来解决这个问题 - 我有一个包含 用户报告强>。每个报告都有一个id,我将其作为报告编号显示给我的用户。

主要的抱怨是用户对报告为什么从他们的系统中丢失感到困惑。实际上并非如此。实际上,他们正在识别他们的 ID 之间的差距,并假设这些是缺失的报告,而实际上,这只是因为另一个用户填补了这个自动递增的差距。

我需要知道在 MySQL 中是否有办法做到这一点:

我是否可以有一个名为 report_numbersecond 自动增量字段,它基于具有不同的 user_id 字段每个用户的自动增量集?

例如

|------|---------|---------------|
|  id  | user_id | report_number |
|------|---------|---------------|
|  1   |    1    |       1       |
|  2   |    1    |       2       |
|  3   |    1    |       3       |
|  4   |    2    |       1       |
|  5   |    1    |       4       |
|  6   |    1    |       5       |
|  7   |    2    |       2       |
|  8   |    3    |       1       |
|  9   |    3    |       2       |
|------|---------|---------------|

我为此使用 InnoDB,因为它的外键权重很大。当我添加第二个自动增量字段时,它似乎在抱怨,但我不确定是否有其他方法可以做到这一点?

【问题讨论】:

  • 这通常在客户端解决。客户端可以递增地标记行。它甚至不需要report_number 来做到这一点。

标签: mysql sql database-design relational-database innodb


【解决方案1】:

我认为 mysql 不支持两个 auto_increment 列。您可以使用信息架构创建报告编号。

select NULL from information_schema.columns  

【讨论】:

    【解决方案2】:

    MySQl 不支持两个自增字段,如果你需要再创建一个表,设置另一个你想要自增的字段,你必须和这两个表建立关系。

    【讨论】:

      【解决方案3】:

      MyISAM 支持自动递增的第二列,但 InnoDB 不支持

      对于 InnoDB,您可以创建一个触发器 BEFORE INSERT 以获取 reportid 的最大值并将该值加一。

      DELIMITER $$
      CREATE TRIGGER report_trigger
      BEFORE INSERT ON reports
      FOR EACH ROW BEGIN
          SET NEW.`report_id` = (SELECT MAX(report_id) + 1 FROM reports WHERE user_id = NEW.user_id);
      END $$
      DELIMITER ;
      

      如果你可以改用MyISAM,在MySQL页面的文档中有一个例子:

      http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html

      CREATE TABLE animals (
          grp ENUM('fish','mammal','bird') NOT NULL,
          id MEDIUMINT NOT NULL AUTO_INCREMENT,
          name CHAR(30) NOT NULL,
          PRIMARY KEY (grp,id)
      ) ENGINE=MyISAM;
      
      INSERT INTO animals (grp,name) VALUES
          ('mammal','dog'),('mammal','cat'),
          ('bird','penguin'),('fish','lax'),('mammal','whale'),
          ('bird','ostrich');
      
      SELECT * FROM animals ORDER BY grp,id;
      

      返回:

      +--------+----+---------+
      | grp    | id | name    |
      +--------+----+---------+
      | fish   |  1 | lax     |
      | mammal |  1 | dog     |
      | mammal |  2 | cat     |
      | mammal |  3 | whale   |
      | bird   |  1 | penguin |
      | bird   |  2 | ostrich |
      +--------+----+---------+
      

      【讨论】:

        【解决方案4】:

        IFNULL 正确的一个:

        DELIMITER $$
        CREATE TRIGGER salons_trigger
        BEFORE INSERT ON salon
        FOR EACH ROW BEGIN
            SET NEW.salon_id = IFNULL((SELECT MAX(salon_id) + 1 FROM salon WHERE owner = NEW.owner), 1);
        END $$
        DELIMITER ;
        

        【讨论】:

          猜你喜欢
          • 2011-04-06
          • 1970-01-01
          • 1970-01-01
          • 2016-10-31
          • 1970-01-01
          • 2012-02-15
          • 2017-05-11
          • 1970-01-01
          • 2012-01-31
          相关资源
          最近更新 更多