2015-05-13 144 views
1

我的意图是创建一个表与2主键与其中一个自动增量和其他指定插入时,当我为此表创建一个新字段时,它必须开始重新计数,如果不递增主键更改。这是我有什么:1 auto_increment与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的默认号码有什么不同?

有没有办法像我想要的那样得到它?

SOLUTION:

表即可恢复InnoDB的是好多了,没有必要为auto_incrementCONFIGURABLES表作为该做插入时,将控制。

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; 
+2

_Two_主键?这是_unpossible!_ :-) – paxdiablo

+0

为了履行FK支持,你需要InnoDB。另一方面,复合auto_increment仅在MyISAM中受支持。所以我想你需要引入代理PK,使你当前的一个只是复合独特的键 –

+0

你确定ALTER TABLE CONFIGURABLES AUTO_INCREMENT = 100;执行?我看起来很好。 – massie

回答

1
BEGIN; 
    SELECT @id := MAX(id)+1 FROM foo WHERE other = 123 FOR UPDATE; 
    INSERT INTO foo 
    (other, id, ...) 
    VALUES 
    (123, @id, ...); 
    COMMIT; 
+0

非常感谢,我需要更改为IFNULL(MAX(ID)+1,100)MAX(id)+1,因为它给了我错误,因为当试图第一次插入select返回null。我用解决方案编辑了答案。再次感谢你! :) – danibg

0

你怎么插入你的数据吗?如果您将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); 

现在覆盖AUTO_INCREMENT:

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

运行SQL:

SELECT * 
FROM CONFIGURABLES; 

输出:

CODIEI2 CODIEI1 
1 2 
100 1 
+0

我明白你的意思。这不是问题,我的插入看起来像这样“INSERT INTO CONFIGURABLES VALUES(NULL,10001,'',1,2,2);” 。当表引擎是InnoDB(在我的情况下是默认值)时,auto_increment被设置为100,但当我将其更改为MyISAM以便能够重置auto_increment重新计数时,这不起作用。感谢您的时间和帮助btw :) – danibg

相关问题