Nel modello relazionale, qualsiasi colonna o set di colonne che è garantito sia presente che unico nella tabella può essere chiamato una chiave candidata alla tabella. "Presente" significa "NOT NULL". È prassi comune nella progettazione di database designare una delle chiavi candidate come chiave primaria e utilizzare riferimenti alla chiave primaria per fare riferimento all'intera riga o all'oggetto dell'oggetto descritto dalla riga.
In SQL, un vincolo PRIMARY KEY equivale a un vincolo NOT NULL per ogni colonna di chiave primaria e un vincolo UNIQUE per tutte le colonne di chiavi primarie prese insieme. In pratica molte chiavi primarie risultano essere singole colonne.
Per la maggior parte dei prodotti DBMS, un vincolo PRIMARY KEY produrrà anche un indice che viene generato automaticamente sulle colonne chiave primarie. Ciò accelera l'attività di verifica dei sistemi quando vengono create nuove voci per la chiave primaria, per assicurarsi che il nuovo valore non duplichi un valore esistente. Inoltre velocizza le ricerche in base al valore della chiave primaria e si unisce tra la chiave primaria e una chiave esterna che la fa riferimento. L'entità della velocità dipende da come funziona Query Optimizer.
In origine, i progettisti di database relazionali cercavano le chiavi naturali nei dati come dati. Negli ultimi anni, la tendenza è stata quella di creare sempre una colonna denominata ID, un intero come prima colonna e la chiave primaria di ogni tabella. La funzione di generazione automatica del DBMS viene utilizzata per garantire che questa chiave sia univoca. Questa tendenza è documentata negli "standard di progettazione di Oslo".Non è necessariamente un progetto relazionale, ma serve alcuni bisogni immediati delle persone che lo seguono. Non raccomando questa pratica, ma riconosco che è la pratica prevalente.
Un indice è una struttura dati che consente di accedere rapidamente a poche righe in una tabella, in base a una descrizione delle colonne della tabella che sono indicizzate. L'indice consiste in copie di determinate colonne di tabelle, chiamate chiavi dell'indice, intervallate da puntatori alle righe della tabella. I puntatori sono generalmente nascosti agli utenti del DBMS. Gli indici funzionano in tandem con Query Optimizer. L'utente specifica in SQL quali dati vengono ricercati e l'ottimizzatore fornisce strategie indicizzate e altre strategie per tradurre ciò che viene cercato in una strategia per trovarlo. Esiste un qualche tipo di principio organizzativo, come l'ordinamento o l'hashing, che consente di utilizzare un indice per ricerche veloci e altri usi. Questo è tutto interno al DBMS, una volta che il builder del database ha creato l'indice o dichiarato la chiave primaria.
È possibile creare indici che non hanno nulla a che fare con la chiave primaria. Una chiave primaria può esistere senza un indice, sebbene questa sia generalmente una pessima idea.
fonte
2009-08-22 15:00:22
grazie, sei stato molto utile! Mi stavo chiedendo però, è l'impostazione di una colonna come PK qualsiasi diversa dall'impostazione di una colonna come un numero intero univoco che auto_incrementi? Fa qualcos'altro sotto il cofano? – Mala
Ho modificato per rispondere alla tua domanda sui lati negativi degli indici. Anche le chiavi primarie funzionano come indici, quindi quando hai un PK su una colonna, tutte le query per SELECT o ORDER BY basate su quell'id saranno più veloci. Inoltre, sarebbe garantito che ogni 'id' è unico, quindi non avrai ID duplicati come potresti avere se hai solo una colonna INT che stai aggiornando. –
Una chiave primaria non deve essere numerica o un singolo campo. e la colonna IDENTITY si adatterebbe meglio a questa descrizione. Invece una chiave primaria serve a comunicare all'RDBMS che i campi specificati possono identificare in modo univoco una singola riga nella tabella. Essenzialmente un INDICE UNICO. È normale (ma non obbligatorio) che le chiavi primarie siano anche il fattore di controllo in quale ordine vengono archiviati i dati (chiave primaria in cluster in SQLServer) e quindi migliorano sensibilmente il tempo richiesto per trovare le righe di dati (per leggere, scrivere, qualunque sia) – MatBailie