2010-05-24 18 views
35

è scritto in ogni libro che le chiavi esterne sono in realtà chiave primaria in qualche altra tabella ma possiamo avere una chiave esterna che non è chiave primaria in qualsiasi altra tabellapossiamo avere una chiave esterna che non è una chiave primaria in nessun'altra tabella?

+0

Perché vuoi? – JeffO

+0

non c'è una ragione specifica qualcuno mi ha chiesto questo e mi sono confuso questo è il motivo per cui volevo solo sapere che è – Mac

+0

Perché? Beh, questo dipende da quali sono le tue ragioni per scegliere una chiave primaria in primo luogo - formalmente parlando non c'è una ragione assoluta per scegliere una chiave primaria rispetto ad un'altra quindi non ci sono motivi particolari per dire perché sarebbe o non sarebbe lo stesso uno usato per riferimenti di chiavi straniere. Inoltre, è potenzialmente consigliabile in alcuni casi utilizzare più di una chiave candidata per tabella come riferimento di chiave esterna. In tal caso, uno di quei riferimenti ovviamente non è la chiave primaria - a meno che tu non voglia chiamare più di una chiave quella "primaria"! – sqlvogel

risposta

40

Sì - è possibile avere una chiave esterna che fa riferimento a una indice univoco in un'altra tabella.

+5

Questo è corretto in Microsoft SQL Server ma non è SQL stanard e non è supportato da tutti gli altri DBMS. In SQL standard ISO non esiste un indice e sono sempre necessari vincoli FOREIGN KEY per abbinare vincoli UNIQUE o PRIMARY KEY. Personalmente preferirei sempre utilizzare vincoli univoci piuttosto che indici univoci senza vincoli. Penso che un vincolo renda più chiaro il significato previsto e che la sintassi del vincolo sia più facilmente comprensibile da un altro sviluppatore di database. – sqlvogel

+4

@David: sì, ma l'OP chiedeva di SQL Server ..... –

13

Per definizione una chiave esterna deve fare riferimento a una chiave candidata di una tabella. Non deve necessariamente essere la chiave primaria.

Per motivi di dettaglio, il vincolo denominato FOREIGN KEY in SQL non è esattamente equivalente alla definizione da libro di testo di una chiave esterna nel modello relazionale. Vincolo FOREIGN KEY di SQL differisce perché:

  • può riferire qualsiasi insieme di colonne soggetti ad un vincolo di unicità, anche se non sono chiavi candidate (superchiavi o colonne annullabili per esempio).
  • può includere null, nel qual caso il vincolo non viene applicato
  • sua sintassi dipende ordine della colonna, quindi un vincolo fk su (A, B) riferimento (A, B) è diverso da un vincolo (B , A) referenziamento (A, B).
+0

APC non è sicuro del motivo per cui si desidera modificarlo per sostituire "SQL" con "SQL Server". I miei commenti si applicano a SQL (ovvero al linguaggio standard definito da ISO). Si applicano a tutte le implementazioni di SQL che conosco, non solo a SQL Server. – sqlvogel

+0

Sì, cos'è con queste persone che modificano i post senza sapere cosa stanno facendo. Io voto per non consentire modifiche a Risposte. – PerformanceDBA

3

Sì, può esserci una chiave esterna che è una chiave univoca in un'altra tabella poiché la chiave Univoca è una sottoserie di chiave primaria ma non la chiave primaria esatta.

Quindi è possibile che la chiave esterna sia una chiave univoca in un'altra tabella.

0

La risposta standard standard è no. È possibile solo se la chiave esterna fa riferimento a una colonna in modo univoco in un'altra tabella. Ciò significa che la chiave esterna deve essere la chiave candidata in un'altra tabella e la chiave primaria è anche una chiave candidata alla tabella.

Problemi correlati