2011-11-13 5 views
20

Oto tabela w MySQL 5.3.X + DB:MySQL: # 1075 - Niepoprawna definicja tabeli; autoincrement vs inny klucz?

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 kolumna nie jest wykorzystywana w zapytaniach, to tylko dla wygody wizualnym (tak łatwo jest zobaczyć, jak tabela rośnie). Członek jest rzeczywistym kluczem, jest unikalny, a członek jest używany w zapytaniach do identyfikacji dowolnego członka (WHERE memberid = 'abcde').

Moje pytanie brzmi: jak zachować auto_increment, ale czy memberid jest kluczem podstawowym? Czy to jest możliwe? Kiedy próbuję utworzyć tę tabelę z PRIMARY KEY (memberid), otrzymuję błąd:

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

Co jest najlepszym wyborem (Mam nadzieję, że istnieje sposób, aby zatrzymać kolumnę id więc wydajność jest dobra i kwerendy identyfikują dowolnego użytkownika według memberid, a nie id), jeśli wydajność jest bardzo ważna (chociaż miejsce na dysku nie jest)?

Odpowiedz

41

Ty może mieć kolumnę autoinkrementacja że nie jest PRIMARY KEY, tak długo jak nie jest indeksem (klucz) na nim:

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 i dzięki za komentarz, dowiedziałem się czegoś dzisiaj :) –

4

Możesz ustawić id jako klucz podstawowy i ustawić parametr member_id na NOT NULL UNIQUE. (Co zrobiłeś.) Kolumny o numerach NOT NULL UNIQUE mogą być celem kluczy obcych, podobnie jak klucz podstawowy. (Jestem prawie pewien, że dotyczy to wszystkich platform SQL.)

Na poziomie koncepcyjnym nie ma różnicy między PRIMARY KEY a NOT NULL UNIQUE. Na poziomie fizycznym jest to problem z MySQL; inne platformy SQL pozwolą ci użyć sekwencji bez uczynienia jej kluczem podstawowym.

Ale jeśli wydajność jest naprawdę ważna, powinieneś dwa razy pomyśleć o rozszerzeniu stołu o cztery bajty na wiersz dla tej niewielkiej wygody wizualnej. Ponadto, jeśli przełączysz się na INNODB w celu wymuszenia ograniczeń klucza obcego, MySQL użyje klucza podstawowego w indeksie klastrowym. Ponieważ nie używasz klucza głównego, wyobrażam sobie, że może to zaszkodzić wydajności.

0

Do powyższej kwestii, przede wszystkim jeśli załóżmy tabele zawierają więcej niż jeden klucz podstawowy, następnie najpierw usuń wszystkie klucze podstawowe i dodaj pierwsze pole AUTO INCREMENT jako klucz podstawowy, a następnie dodaj kolejne wymagane klucze podstawowe, które zostały wcześniej usunięte. Ustaw opcję AUTO INCREMENT dla wymaganego pola z obszaru opcji.

0

Myślę, że rozumiem przyczynę twojego błędu. Najpierw kliknij pole AUTO AUTO INCREMENT, a następnie wybierz je jako klucz podstawowy.

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

Bardzo łatwe. Dzięki

4

Najpierw należy utworzyć tabelę bez 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; 

po identyfikacyjnego jako indeksu

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

po identyfikacyjnego jako 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 ;