2011-11-13 11 views
20

Ecco una tabella in MySQL 5.3.x + db:MySQL: # 1075 - Definizione della tabella errata; autoincrement vs un'altra chiave?

CREATE TABLE members` (
    `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `memberid` VARCHAR(30) NOT NULL , 
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    `firstname` VARCHAR(50) NULL , 
    `lastname` VARCHAR(50) NULL , 
    UNIQUE (memberid), 
    PRIMARY KEY (id) 
) ENGINE = MYISAM; 

Id colonna viene mai usato nelle query, è solo per comodità visiva (così è facile vedere come la tabella cresce). Memberid è una chiave effettiva, è univoco e memberid viene utilizzato nelle query per identificare qualsiasi membro (WHERE memberid = 'abcde').

La mia domanda è: come mantenere auto_increment, ma rendere memberid come chiave primaria? È possibile? Quando cerco di creare questa tabella con PRIMARY KEY (memberId), ottengo un errore:

1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

Qual è la scelta migliore (Si spera, non v'è un modo per tenere colonna id quindi le prestazioni è buono e le query identificano qualsiasi utente da memberid, non da id), se la prestazione è molto importante (sebbene lo spazio su disco non lo sia)?

risposta

41

È può avere una colonna incremento automatico che non è il PRIMARY KEY, a patto che ci sia un indice (chiave) su di esso:

CREATE TABLE members ( 
    id int(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    memberid VARCHAR(30) NOT NULL , 
    `time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    firstname VARCHAR(50) NULL , 
    lastname VARCHAR(50) NULL , 
    PRIMARY KEY (memberid) , 
    KEY (id)       --- or: UNIQUE KEY (id) 
) ENGINE = MYISAM; 
+0

+1 e grazie per il commento, ho imparato qualcosa oggi :) –

4

È possibile impostare l'id come chiave primaria e impostare member_id su NOT NULL UNIQUE. (Che cosa hai fatto.) Le colonne che sono NOT NULL UNIQUE possono essere il bersaglio di riferimenti di chiavi esterne, proprio come può fare una chiave primaria. (Sono abbastanza sicuro che sia vero per tutte le piattaforme SQL.)

A livello concettuale, non c'è differenza tra PRIMARY KEY e NOT NULL UNIQUE. A livello fisico, questo è un problema di MySQL; altre piattaforme SQL ti consentono di utilizzare una sequenza senza renderla la chiave primaria.

Ma se le prestazioni sono davvero importanti, dovresti pensarci due volte prima di ampliare il tuo tavolo di quattro byte per riga per quel piccolo vantaggio visivo. Inoltre, se si passa a INNODB per applicare i vincoli di chiave esterna, MySQL utilizzerà la propria chiave primaria in un indice cluster. Dal momento che non stai usando la tua chiave primaria, immagino che ciò possa danneggiare le prestazioni.

0

Per la questione di cui sopra, prima di tutto se supponiamo le tabelle contengono più di una chiave primaria, quindi rimuovere prima tutte quelle chiavi primarie e aggiungere il primo campo AUTO INCREMENT come chiave primaria, quindi aggiungere un'altra chiave primaria richiesta che viene rimossa in precedenza. Impostare l'opzione AUTO INCREMENT per il campo richiesto dall'area delle opzioni.

0

Penso di aver capito qual è la ragione del tuo errore. Prima di fare clic sul campo AUTO AUTO INCREMENT, quindi selezionarlo come chiave primaria.

The Right way is First You have to select it as a primary key then you have to click auto AUTO INCREMENT field.

Molto facile. Grazie

4

Innanzitutto creare tavolo senza auto_increment,

CREATE TABLE `members`(
    `id` int(11) NOT NULL, 
    `memberid` VARCHAR(30) NOT NULL , 
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    `firstname` VARCHAR(50) NULL , 
    `lastname` VARCHAR(50) NULL 
    PRIMARY KEY (memberid) 
) ENGINE = MYISAM; 

dopo set id come indice,

ALTER TABLE `members` ADD INDEX(`id`); 

dopo set id come auto_increment,

ALTER TABLE `members` CHANGE `id` `id` INT(11) NOT NULL AUTO_INCREMENT; 

Or

CREATE TABLE IF NOT EXISTS `members` (
    `id` int(11) NOT NULL, 
    `memberid` VARCHAR(30) NOT NULL , 
    `Time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , 
    `firstname` VARCHAR(50) NULL , 
    `lastname` VARCHAR(50) NULL, 
     PRIMARY KEY (`memberid`), 
     KEY `id` (`id`) 
) ENGINE=MYISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 
Problemi correlati