指定的密钥太长:最大密钥长度为 3072 字节

Vzq*_*van 7 mysql database innodb

我需要您的帮助,我已经实例化了所有关系表,但是当我要创建关系表时,它向我发送“错误:1071 指定的密钥太长:最大密钥长度为 3072 字节”

到目前为止我的代码:

CREATE TABLE tablahechos(
id_almacenf VARCHAR(255) NOT NULL,
id_productof VARCHAR(255) NOT NULL,
id_categoriaf VARCHAR(255) NOT NULL,
id_transaccionf VARCHAR(255) NOT NULL,
id_tipo_serviciof VARCHAR(255) NOT NULL,
id_mensajerof VARCHAR(255) NOT NULL,
id_clientef VARCHAR(255) NOT NULL,
id_tiempo_fecha_orden VARCHAR(255) NOT NULL,
id_tiempo_fecha_reserva_entrada VARCHAR(255) NOT NULL,
id_tiempo_fecha_reserva_salida VARCHAR(255) NOT NULL,
id_tiempo_fecha_inventario_entrada VARCHAR(255) NOT NULL,
id_tiempo_fecha_inventario_salida VARCHAR(255) NOT NULL,
id_tiempo_fecha_envio VARCHAR(255) NOT NULL,
id_tiempo_fecha_facturacion VARCHAR(25) NOT NULL,
id_tiempo_fecha_cancelada VARCHAR(255) NOT NULL,
para_regalo VARCHAR(45) NOT NULL,
monto_unitario VARCHAR(255) NOT NULL,
monto_total VARCHAR(45) NOT NULL,
cantidad VARCHAR(255) NOT NULL,
PRIMARY KEY (id_almacenf, id_productof, id_categoriaf, id_transaccionf, 
id_tipo_serviciof, id_mensajerof, id_clientef, id_tiempo_fecha_orden,
id_tiempo_fecha_reserva_entrada, id_tiempo_fecha_reserva_salida,
id_tiempo_fecha_inventario_entrada, id_tiempo_fecha_inventario_salida,
id_tiempo_fecha_envio, id_tiempo_fecha_facturacion, id_tiempo_fecha_cancelada),
CONSTRAINT FK1
  FOREIGN KEY (id_almacenf)
  REFERENCES almacendim (id_almacen),
CONSTRAINT FK2
  FOREIGN KEY (id_productof)
  REFERENCES productodim (id_producto),
CONSTRAINT FK3
  FOREIGN KEY (id_categoriaf)
  REFERENCES categoriadim (id_categoria),
CONSTRAINT FK4
  FOREIGN KEY (id_transaccionf)
  REFERENCES transacciondim (id_transaccion),
CONSTRAINT FK5
  FOREIGN KEY (id_mensajerof)
  REFERENCES mensajerodim (id_mensajero),
CONSTRAINT FK6
  FOREIGN KEY (id_clientef)
  REFERENCES clientedim (id_cliente),
CONSTRAINT FK7
  FOREIGN KEY (id_tiempo_fecha_orden)
    REFERENCES tablahechos (id_tiempo_fecha_orden),
CONSTRAINT FK8
  FOREIGN KEY (id_tiempo_fecha_reserva_entrada)
  REFERENCES tablahechos (id_tiempo_fecha_reserva_entrada),
CONSTRAINT FK9 
  FOREIGN KEY (id_tiempo_fecha_reserva_salida)
  REFERENCES tablahechos (id_tiempo_fecha_reserva_salida),
CONSTRAINT FK10
  FOREIGN KEY (id_tiempo_fecha_inventario_entrada)
  REFERENCES tablahechos (id_tiempo_fecha_inventario_entrada),
CONSTRAINT FK11 
  FOREIGN KEY (id_tiempo_fecha_inventario_salida)
  REFERENCES tablahechos (id_tiempo_fecha_inventario_salida),
CONSTRAINT FK12
  FOREIGN KEY (id_tiempo_fecha_envio)
    REFERENCES tablahechos (id_tiempo_fecha_envio),
CONSTRAINT FK13
  FOREIGN KEY (id_tiempo_fecha_facturacion)
  REFERENCES tablahechos (id_tiempo_fecha_facturacion),
CONSTRAINT FK14
  FOREIGN KEY (id_tiempo_fecha_cancelada) 
  REFERENCES tablahechos (id_tiempo_fecha_cancelada)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

我已经将字符集更改为latin1但没有任何反应,我知道我的主键太长但必须是这样。我应该怎么办?

Gor*_*off 4

幸运的是,有最大密钥长度,因为您的主键太长了。

我强烈建议在表中添加一个自动递增的主键:

CREATE TABLE tablahechos (
    id_hechos int not null auto_increment primary key,
    id_almacenf VARCHAR(255) NOT NULL,
    . . .
Run Code Online (Sandbox Code Playgroud)

这给你带来了什么?那么,这个简化的主键有几个方面的帮助:

  • 它使得在表中查找单行变得更加容易。
  • 它极大地简化了任何外键引用。
  • 它提供了一种确定行插入顺序的机制。

如果您想在所有这些列上构建键,您可以将列的长度缩短到 32 之类的长度。“id”列的长度真的需要为 255 个字符吗?如果是这样,您也应该在这些表中将它们替换为数字 ID。事实上,您可能应该对所有这些列使用整数 id,并通过连接来查找有关它们的附加信息。