【发布时间】: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