MySQL – Significato di “PRIMARY KEY”, “UNIQUE KEY” e “KEY” se usati insieme durante la creazione di una tabella

Qualcuno può spiegare lo scopo di PRIMARY KEY , UNIQUE KEY e KEY , se è messo insieme in una singola istruzione CREATE TABLE in MySQL?

 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 posso convertire questa query in MSSQL?

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 manuale lo spiega come segue:

Un indice UNIQUE crea un vincolo in modo tale che tutti i valori dell’indice debbano essere distinti. Si verifica un errore se si tenta di aggiungere una nuova riga con un valore chiave corrispondente a una riga esistente. Questo vincolo non si applica ai valori NULL tranne per il motore di archiviazione BDB. Per altri motori, un indice UNIQUE consente più valori NULL per le colonne che possono contenere NULL. Se si specifica un valore 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 vengono utilizzati gli indici in generale: qui .

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

Non testato, ma credo che l’equivalente MSSQL sia:

 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); 

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

Giusto per aggiungere alle altre risposte, la documentazione fornisce questa spiegazione:

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

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

  • Una PRIMARY KEY è un indice univoco in cui tutte le colonne chiave devono essere definite come NOT NULL . Se non vengono dichiarati esplicitamente come NOT NULL , MySQL li dichiara in modo implicito (e in silenzio). Una tabella può avere solo un PRIMARY KEY . Il nome di una PRIMARY KEY è sempre PRIMARY , che quindi non può essere utilizzato come nome per qualsiasi altro tipo di indice.

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 dettagli è ansible consultare http://www.geeksww.com/tutorials/database_management_systems/mysql/tips_and_tricks/mysql_primary_key_vs_unique_key_constraints.php

per convertire mysql in mssql prova questo e vedi http://gathadams.com/2008/02/07/convert-mysql-to-ms-sql-server/