【问题标题】:Auto Increment Composite Key InnoDB自动增量复合键 InnoDB
【发布时间】:2012-08-11 17:21:31
【问题描述】:

我想为 InnoDB MySQL 表创建类似 MyISAM 的行为。我想要一个复合主键:

主键(id1,id2)

其中 id1 根据 id2 的值自动递增。使用 InnoDB 完成此任务的最佳方法是什么?

+----------+-------------+--------------+
|      id1 |         id2 | other_column |
+----------+-------------+--------------+
|        1 |           1 | Foo          |
|        1 |           2 | Bar          |
|        1 |           3 | Bam          |
|        2 |           1 | Baz          |
|        2 |           2 | Zam          |
|        3 |           1 | Zoo          |
+----------+-------------+--------------+

【问题讨论】:

  • “id1 根据 id2 的值自动递增的位置”是什么意思?
  • 查看发布的示例数据。这就是我想要的行为。
  • 你可以做很多工作来实现这样的目标。这将是缓慢的片状和脆弱的。这应该是两个表,或单个值键。
  • 所以id2是手动插入的,id1只有在发生主键冲突时才会递增?
  • 你为什么想要这种行为?

标签: mysql innodb


【解决方案1】:

您可以使用此 BEFORE INSERT 触发器来替换零 id 值 -

CREATE TRIGGER trigger1
  BEFORE INSERT
  ON table1
  FOR EACH ROW
BEGIN

  SET @id1 = NULL;

  IF NEW.id1 = 0 THEN
    SELECT COALESCE(MAX(id1) + 1, 1) INTO @id1 FROM table1;
    SET NEW.id1 = @id1;
  END IF;

  IF NEW.id2 = 0 THEN

    IF @id1 IS NOT NULL THEN
      SET NEW.id2 = 1;
    ELSE
      SELECT COALESCE(MAX(id2) + 1, 1) INTO @id2 FROM table1 WHERE id1 = NEW.id1;
      SET NEW.id2 = @id2;
    END IF;

  END IF;

END

然后插入零值(id1 或 id2)以生成新值 -

INSERT INTO table7 VALUES(0, 0, '1');
INSERT INTO table7 VALUES(0, 0, '2');
INSERT INTO table7 VALUES(1, 0, '3');
INSERT INTO table7 VALUES(1, 0, '4');
INSERT INTO table7 VALUES(1, 0, '5');
...

【讨论】:

    猜你喜欢
    • 2012-12-14
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 2017-04-27
    • 2016-11-11
    相关资源
    最近更新 更多