Pregunta

tengo una mesa en MySQL eso tiene 3 campos y quiero imponer la unicidad entre dos de los campos.aqui esta la mesa DDL:

CREATE TABLE `CLIENT_NAMES` (
`ID` int(11) NOT NULL auto_increment,
`CLIENT_NAME` varchar(500) NOT NULL,
`OWNER_ID` int(11) NOT NULL,
PRIMARY KEY  (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

El ID El campo es una clave sustituta (esta tabla se está cargando con ETL).El CLIENT_NAME es un campo que contiene nombres de clientes el OWNER_ID es una identificación que indica el propietario de un cliente.

Pensé que podría hacer cumplir esto con un índice único en CLIENT_NAME y OWNER_ID,

ALTER TABLE `DW`.`CLIENT_NAMES` 
ADD UNIQUE INDEX enforce_unique_idx(`CLIENT_NAME`, `OWNER_ID`);

pero MySQL me da un error:

Error al ejecutar comandos SQL para actualizar la tabla.La clave especificada era demasiado larga;la longitud máxima de la clave es 765 bytes (error 1071)

Alguien mas tiene alguna idea?

¿Fue útil?

Solución

MySQL no puede imponer la unicidad en claves que tengan más de 765 bytes (y aparentemente 500 caracteres UTF8 pueden superar este límite).

  1. ¿CLIENTE_NOMBRE realmente necesita tener 500 caracteres?Parece un poco excesivo.
  2. Agregue una nueva columna (más corta) que sea hash(CLIENT_NAME).En su lugar, obtenga MySQL para imponer la unicidad en ese hash.

Otros consejos

¿Has mirado RESTRICCIÓN...?¿ÚNICO?

Algo parece un poco extraño en esta mesa;De hecho, pensaría en refactorizarlo.¿A qué se refieren ID y OWNER_ID y cuál es la relación entre ellos?

¿Tendría sentido tener

CREATE TABLE `CLIENTS` (
`ID` int(11) NOT NULL auto_increment,
`CLIENT_NAME` varchar(500) NOT NULL,
# other client fields - address, phone, whatever
PRIMARY KEY  (`ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `CLIENTS_OWNERS` (
`CLIENT_ID` int(11) NOT NULL,
`OWNER_ID` int(11) NOT NULL,
PRIMARY KEY  (`CLIENT_ID`,`OWNER_ID`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Realmente evitaría agregar una clave única como esa en una cadena de 500 caracteres.Es mucho más eficiente imponer la unicidad en dos entradas, además una identificación en una tabla realmente debería referirse a algo que necesita una identificación;en tu versión, el ID El campo parece identificar solo la relación cliente/propietario, que realmente no necesita una identificación separada, ya que es solo un mapeo.

Aquí.Para el juego de caracteres UTF8, MySQL puede utilizar hasta 3 bytes por carácter.CLIENT_NAME es 3 x 500 = 1500 bytes.Acortar CLIENT_NAME a 250.

más tarde: +1 para crear un hash del nombre y usarlo como clave.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top