Sarebbe possibile in SQL Server 2008 avere una tabella creata con 2 colonne che sono allo stesso tempo chiavi primarie e esterne? Se sì, come sarebbe un simile codice? Ho cercato e non ho trovato nulla.Chiave primaria e esterna allo stesso tempo
risposta
Certo, nessun problema:
CREATE TABLE dbo.[User]
(
Id int NOT NULL IDENTITY PRIMARY KEY,
Name nvarchar(1024) NOT NULL
);
CREATE TABLE [Group]
(
Id int NOT NULL IDENTITY PRIMARY KEY,
Name nvarchar(1024) NOT NULL
);
CREATE TABLE [UserToGroup]
(
UserId int NOT NULL,
GroupId int NOT NULL,
PRIMARY KEY CLUSTERED (UserId, GroupId),
FOREIGN KEY (UserId) REFERENCES [User] (Id) ON UPDATE NO ACTION ON DELETE CASCADE,
FOREIGN KEY (GroupId) REFERENCES [Group] (Id) ON UPDATE NO ACTION ON DELETE CASCADE
);
Questo è abbastanza comunemente usato per modellare molti-a-molti rapporti.
Proprio come una FYI, in 'information_schema.key_column_usage' per la tabella' UserToGroup', sia 'UserID' che' GroupID 'restituiranno due righe ciascuna ... una per PK, una per FK ... [in riferimento a ...] (http://stackoverflow.com/a/15622288/623952) –
Questi sono costrutti totalmente diversi.
A La chiave primaria viene utilizzata per forzare l'univocità all'interno di una tabella ed essere un identificativo univoco per un determinato record.
A La chiave esterna viene utilizzata per l'integrità referenziale, per assicurarsi che esista un valore in un'altra tabella.
La chiave esterna deve fare riferimento alla chiave primaria in un'altra tabella.
Se si desidera che anche una chiave esterna sia univoca, è possibile creare un vincolo FK e aggiungere un unico indice/vincolo allo stesso campo.
Per scopi di riferimento, SQL Server consente a un FK di fare riferimento a un campo UNIQUE CONSTRAINT
nonché a un campo PRIMARY KEY
.
Solo una breve nota - dalle pagine di Microsoft (http://msdn.microsoft.com/en-us/library/ms189049.aspx) ...
"Un vincolo di chiave esterna non deve essere collegato solo a un vincolo di chiave primaria di un'altra tabella, ma può anche essere definito per fare riferimento le colonne di un vincolo UNIQUE in un'altra tabella. "
Non utilizzato spesso, ma utile in alcune circostanze.
Probabilmente non è una buona idea poiché spesso si desidera consentire duplicare chiavi esterne nella tabella. Anche se non lo fai ora, in futuro, potresti, quindi, meglio non farlo. Vedi Is it fine to have foreign key as primary key?
Perché no? Come il link che hai inserito, dice che ci sono casi come la relazione 1-a-1 in cui potrebbe essere necessario –
Non ho detto che è SEMPRE una cattiva idea;) Hai ragione, ci possono essere eccezioni dove sarà essere sempre un 1: 1. Il mio commento è qui per far riflettere le persone sulla scelta giusta per loro. – thebiggestlebowski
Intendi cosa significherebbe l'SQL per creare il tavolo? –
Questo è un caso molto comune sui framework ORM che suppportano il mapping dell'eredità eseguendo il mapping table-per-class. Ad esempio se una classe B eredita da una classe A e quelle sono mappate a table_a e table_b, è normale che le istanze di B abbiano lo stesso id su table_a e table_b, e table_b definisce un FK sulla sua colonna id su table_a colonna id. Basta provare a definire FK e PK utilizzando SQLServer Management Studio. –