Domanda

Ho un tavolo dentro MySQL che ha 3 campi e voglio imporre l'unicità tra due campi.Ecco la tabella 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;

IL ID il campo è una chiave surrogata (questa tabella viene caricata con ETL).IL CLIENT_NAME è un campo che contiene nomi dei clienti il OWNER_ID è un ID indica il proprietario di un cliente.

Pensavo di poterlo applicare con un indice univoco su CLIENT_NAME E OWNER_ID,

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

ma MySQL mi dà un errore:

Errore durante l'esecuzione dei comandi SQL per aggiornare la tabella.La chiave specificata era troppo lunga;la lunghezza massima della chiave è 765 byte (errore 1071)

Qualcun altro ha qualche idea?

È stato utile?

Soluzione

MySQL non può imporre l'unicità su chiavi più lunghe di 765 byte (e apparentemente 500 caratteri UTF8 possono superare questo limite).

  1. CLIENT_NAME deve davvero contenere 500 caratteri?Sembra un po' eccessivo.
  2. Aggiungi una nuova colonna (più breve) che sia hash(CLIENT_NAME).Ottieni invece MySQL per imporre l'unicità su quell'hash.

Altri suggerimenti

Hai guardato VINCOLI...UNICO?

Qualcosa sembra un po' strano in questo tavolo;In realtà penserei di refactoring.A cosa si riferiscono ID e OWNER_ID e qual è la relazione tra loro?

Avrebbe senso averlo

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;

Eviterei davvero di aggiungere una chiave univoca come quella su una stringa di 500 caratteri.È molto più efficiente imporre l'unicità su due int, inoltre un id in una tabella dovrebbe davvero fare riferimento a qualcosa che necessita di un id;nella tua versione, il ID sembra identificare solo la relazione cliente/proprietario, che in realtà non necessita di un ID separato, poiché è solo una mappatura.

Qui.Per il set di caratteri UTF8, MySQL può utilizzare fino a 3 byte per carattere.CLIENT_NAME è 3 x 500 = 1500 byte.Accorciare CLIENT_NAME a 250.

Dopo: +1 per creare un hash del nome e utilizzarlo come chiave.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top