Pergunta

Eu tenho uma tabela em MySQL que tem 3 campos e quero impor exclusividade entre dois dos campos. Aqui está a DDL tabela:

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;

O campo ID é uma chave substituta (esta tabela está a ser carregado com ETL). O CLIENT_NAME é um campo que contém nomes de clientes O OWNER_ID é um id indica um proprietário de clientes.

Eu pensei que eu poderia fazer valer isso com um índice exclusivo na CLIENT_NAME e OWNER_ID,

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

mas MySQL me dá um erro:

Erro ao executar comandos SQL para a tabela de atualização. chave especificada era muito longo; comprimento de chave máximo é de 765 bytes (erro 1071)

Alguém tem alguma idéia?

Foi útil?

Solução

MySQL não pode impor exclusividade em chaves que são mais de 765 bytes (e aparentemente 500 caracteres UTF8 pode ultrapassar este limite).

  1. O CLIENT_NAME realmente precisa ser de 500 caracteres? Parece um pouco excessivo.
  2. Adicione uma coluna nova (mais curto), que é de hash (CLIENT_NAME). Get MySQL para impor a exclusividade sobre esse hash vez.

Outras dicas

Você já olhou para CONSTRAINT ... UNIQUE?

Algo parece um pouco estranho sobre esta mesa; Eu realmente penso sobre refatoração-lo. O que fazer ID e OWNER_ID referem-se, e qual é a relação entre eles?

Será que faz sentido ter

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;

Eu realmente evitar a adição de uma chave única como essa em uma corda de 500 caracteres. É muito mais eficiente para impor exclusividade em dois ints, além de um ID em uma tabela deve realmente se referir a algo que precisa de uma id; na sua versão, o campo ID parece identificar apenas a relação cliente / proprietário, o que realmente não precisa de um ID separado, uma vez que é apenas um mapeamento.

aqui . Para o conjunto de caracteres UTF-8, o MySQL pode usar até 3 bytes por caractere. CLIENT_NAME é de 3 x 500 = 1500 bytes. CLIENT_NAME Shorten a 250.

mais tarde:. +1 para a criação de um hash do nome e usando isso como a chave

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top