2012-06-06 14 views
56

qualcuno può spiegare circa lo scopo di PRIMARY KEY, UNIQUE KEY e KEY se hanno messo insieme in un unico CREATE TABLE dichiarazione MySQL?MySQL - Nozione di "PRIMARY KEY", "KEY UNIQUE" e "KEY" se usati insieme durante la creazione di un tavolo

CREATE TABLE IF NOT EXISTS `tmp` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `uid` varchar(255) NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `tag` int(1) NOT NULL DEFAULT '0', 
    `description` varchar(255), 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `uid` (`uid`), 
    KEY `name` (`name`), 
    KEY `tag` (`tag`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 ; 

Come convertire questa query in MySQL?

+3

correlati: [? Parola chiave KEY di mySQL] (http://stackoverflow.com/q/924265/697449) Fondamentalmente 'KEY' è sinonimo di' index'. –

risposta

80

Una chiave è solo un indice normale. Un modo per semplificare è pensarlo come un catalogo di carte in una biblioteca. Punta MySQL nella giusta direzione.

Una chiave univoca viene anche utilizzata per migliorare la velocità di ricerca, ma ha il vincolo che non ci possono essere elementi duplicati (non ci sono due xey dove x non è ye x == y).

Il manual spiega come segue:

un indice univoco crea un vincolo tale che tutti i valori dell'indice devono essere distinti. Si verifica un errore se si tenta di aggiungere una nuova riga con un valore della chiave corrispondente a una riga esistente. Questo vincolo non si applica ai valori NULL tranne per il motore di archiviazione BDB. Per gli altri motori, un indice UNIQUE consente più valori NULL per le colonne che possono contenereNULL. Se si specifica un valore di prefisso per una colonna in un indice UNIQUE, , i valori della colonna devono essere univoci all'interno del prefisso.

Una chiave primaria è una chiave univoca "speciale". Fondamentalmente è una chiave unica, tranne per il fatto che è usata per identificare qualcosa.

Il manuale spiega come utilizzare gli indici in generale: here.

In MSSQL, i concetti sono simili. Ci sono indici, vincoli univoci e chiavi primarie.

testato, ma credo che il MSSQL equivalente è:

CREATE TABLE tmp (
    id int NOT NULL PRIMARY KEY IDENTITY, 
    uid varchar(255) NOT NULL CONSTRAINT uid_unique UNIQUE, 
    name varchar(255) NOT NULL, 
    tag int NOT NULL DEFAULT 0, 
    description varchar(255), 
); 

CREATE INDEX idx_name ON tmp (name); 
CREATE INDEX idx_tag ON tmp (tag); 

Edit: il codice di cui sopra è testato per essere corretto; tuttavia, sospetto che ci sia una sintassi molto migliore per farlo. Sono passato un po 'da quando ho usato SQL server, e apparentemente ho dimenticato un bel po' :).

+1

Ottima spiegazione! Anche il codice funziona bene. Grazie mille! – sura2k

+0

Nessun problema. Sono contento di poter aiutare :). – Corbin

+0

Grazie per avermi indicato la posizione corretta nel manuale! – ptpaterson

3

Le chiavi uniche e primarie di MySQL servono per identificare le righe. Può esserci solo una chiave primaria in una tabella ma una o più chiavi univoche. La chiave è solo indice.

per maggiori informazioni è possibile controllare http://www.geeksww.com/tutorials/database_management_systems/mysql/tips_and_tricks/mysql_primary_key_vs_unique_key_constraints.php

per convertire MySQL MSSQL provare questo e vedere http://gathadams.com/2008/02/07/convert-mysql-to-ms-sql-server/

+0

@Paul Bellora, la tua spiegazione è più chiara della mia. Grande. – Wazan

+0

Beh, ho appena citato i documenti e non ho visto la seconda parte sulla conversione. Penso che la risposta di Corbin riassuma bene. –

23

solo per aggiungere alle altre risposte, il documentation dà questa spiegazione:

  • KEY è normalmente sinonimo di INDEX. L'attributo chiave PRIMARY KEY può essere anche specificato come solo KEY quando viene fornito in una definizione di colonna.Questo è stato implementato per la compatibilità con altri sistemi di database.

  • Un indice UNIQUE crea un vincolo tale che tutti i valori nell'indice devono essere distinti. Si verifica un errore se si tenta di aggiungere una nuova riga con un valore della chiave corrispondente a una riga esistente. Per tutti i motori, un indice consente più valori NULL per le colonne che possono contenere NULL.

  • A PRIMARY KEY A è un indice univoco in cui tutte le colonne chiave devono essere definitecome NOT NULL. Se non vengono dichiarati esplicitamente come NOT NULL, MySQL li dichiara in modo implicito (e silenzioso). Un tavolo può avere solo uno PRIMARY KEY. Il nome di PRIMARY KEY è sempre PRIMARY, che quindi non può essere utilizzato come nome per nessun altro tipo di indice.

+0

Grazie a tutti! – sura2k

+0

Compatibilità con altri sistemi di database? Quale altro DBMS usa la parola "KEY" per qualcosa che non è affatto una chiave (un indice)? Ho sempre pensato che fosse solo un po 'di stranezza con MySQL - e che gli autori di MySQL in realtà non sanno cos'è una chiave :) – sqlvogel