【问题标题】:1 auto_increment with 2 primary keys1 个 auto_increment 和 2 个主键
【发布时间】:2015-07-24 10:30:42
【问题描述】:

我的目的是创建一个具有 2 个主键的表,其中一个是自动递增的,另一个是在插入时指定的,当我为此表创建一个新字段时,如果未递增的主键发生更改,它必须开始重新计数。这就是我所拥有的:

我已经能够将表引擎更改为 MyISAM。但是缺少一些东西,auto_increment 不像以前那样从 100 开始。

CREATE TABLE CONFIGURABLES(
    CODIEI2 INTEGER AUTO_INCREMENT,
    CODIEI1 INTEGER,
    SKU VARCHAR(30),
    COLOR INTEGER,
    COLOR2 INTEGER,
    TALLA INTEGER,
    CONSTRAINT PK_CODIEI PRIMARY KEY(CODIEI1,CODIEI2),
    CONSTRAINT FK_CODIEI1 FOREIGN KEY(CODIEI1) REFERENCES PRODUCTOS(ENTITY_ID) ON DELETE CASCADE,
    CONSTRAINT FK_CCOLOR FOREIGN KEY(COLOR) REFERENCES COLORES(CODICOL) ON DELETE CASCADE,
    CONSTRAINT FK_CCOLOR2 FOREIGN KEY(COLOR2) REFERENCES COLORES(CODICOL) ON DELETE CASCADE,
    CONSTRAINT FK_CTALLA FOREIGN KEY(TALLA) REFERENCES TALLAS(CODITLL) ON DELETE CASCADE) ENGINE=MyISAM;

ALTER TABLE CONFIGURABLES AUTO_INCREMENT = 100;

发生这种情况是因为当auto_increment 值与默认值不同时,引擎必须设置为 InnoDB?

有什么方法可以随心所欲吗?

解决方案:

表可以回到 InnoDB,这样会好很多,CONFIGURABLES 表上不需要auto_increment,因为这将在插入时进行控制。

CREATE TABLE CONFIGURABLES(
    CODIEI2 INTEGER,
    CODIEI1 INTEGER,
    SKU VARCHAR(30),
    COLOR INTEGER,
    COLOR2 INTEGER,
    TALLA INTEGER,
    CONSTRAINT PK_CODIEI PRIMARY KEY(CODIEI1,CODIEI2),
    CONSTRAINT FK_CODIEI1 FOREIGN KEY(CODIEI1) REFERENCES PRODUCTOS(ENTITY_ID) ON DELETE CASCADE,
    CONSTRAINT FK_CCOLOR FOREIGN KEY(COLOR) REFERENCES COLORES(CODICOL) ON DELETE CASCADE,
    CONSTRAINT FK_CCOLOR2 FOREIGN KEY(COLOR2) REFERENCES COLORES(CODICOL) ON DELETE CASCADE,
    CONSTRAINT FK_CTALLA FOREIGN KEY(TALLA) REFERENCES TALLAS(CODITLL) ON DELETE CASCADE);

在插入时这样做:

BEGIN;
    SELECT @id := IFNULL(MAX(CODIEI2)+1,100) FROM CONFIGURABLES WHERE CODIEI1 = 10001 FOR UPDATE;
    INSERT INTO CONFIGURABLES
    (CODIEI1,CODIEI2,SKU,COLOR,COLOR2,TALLA)
    VALUES
    (10001,@id,'',4,2,2);
COMMIT;

【问题讨论】:

  • 两个主键?这不可能! :-)
  • 要实现 FK 支持,您需要 InnoDB。另一方面,复合 auto_increment 仅在 MyISAM 中受支持。所以我想你需要引入代理 PK,使你当前的 PK 成为复合唯一键
  • 你确定语句 ALTER TABLE CONFIGURABLES AUTO_INCREMENT = 100;被执行?我觉得不错。
  • @Alma do 我该怎么做?
  • @massie 是的,oi58.tinypic.com/4l0or4.jpg

标签: mysql primary-key innodb auto-increment myisam


【解决方案1】:
  BEGIN;
  SELECT @id := MAX(id)+1 FROM foo WHERE other = 123 FOR UPDATE;
  INSERT INTO foo
     (other, id, ...)
     VALUES
     (123, @id, ...);
  COMMIT;

【讨论】:

  • 非常感谢,我需要将 MAX(id)+1 更改为 IFNULL(MAX(id)+1,100) 因为它在尝试第一次插入时给了我错误选择返回空值。我已经用解决方案编辑了答案。再次感谢你! :)
【解决方案2】:

如何插入数据?如果您将 CODIEI2 作为列和值同时提供,这将覆盖 auto_increment。

在 SQLFiddle 中测试:

构建架构:

CREATE TABLE CONFIGURABLES(
CODIEI2 INTEGER AUTO_INCREMENT,
CODIEI1 INTEGER,
CONSTRAINT PK_CODIEI PRIMARY KEY(CODIEI2));

ALTER TABLE CONFIGURABLES AUTO_INCREMENT = 100;

INSERT INTO CONFIGURABLES ( CODIEI1 ) 
VALUES ( 1 );

现在覆盖自动增量:

INSERT INTO CONFIGURABLES ( CODIEI2, CODIEI1 ) 
VALUES ( 1, 2 );

运行 SQL:

SELECT *
FROM CONFIGURABLES;

输出:

CODIEI2 CODIEI1
1   2
100 1

【讨论】:

  • 我明白你的意思。这不是问题,我的插入看起来像这样“INSERT INTO CONFIGURABLES VALUES (NULL,10001,'',1,2,2);" .当表引擎是 InnoDB(在我的情况下为默认值)时,auto_increment 设置为 100 有效,但是当我将其更改为 MyISAM 以能够重置 auto_increment 重新计数时,这不起作用。感谢您的时间和帮助顺便说一句:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-16
  • 2020-03-09
  • 1970-01-01
相关资源
最近更新 更多