5

Se dichiaro la tabella seguente implica implicitamente che entrambe le chiavi esterne facciano una chiave primaria univoca o devo fare qualcosa in più per rendere entrambi gli attributi come una chiave primaria?SQL Chiavi esterne multiple come chiavi primarie

CREATE TABLE Report_has_Items 
(
    ReportID int REFERENCES Report(ReportID) NOT NULL, 
    ItemID int REFERENCES Item(ItemID) NOT NULL 
) 

Essenzialmente entrambi gli attributi che sono chiavi esterne da altre tabelle, insieme formerebbero una chiave univoca.

risposta

9

No, non lo è. La tabella sopra non ha chiave primaria. Se si desidera utilizzare i campi come chiave primaria utilizzare:

CREATE TABLE Report_has_Items(
    ReportID int REFERENCES Report(ReportID) NOT NULL, 
    ItemID int REFERENCES Item(ItemID) NOT NULL, 
    PRIMARY KEY (ReportID, ItemID) 
) 

o qualcosa di simile a seconda del proprio sql dilect.

3

Non sono sicuro di aver compreso completamente la domanda, ma presumo che si stia tentando di creare una chiave primaria composta (chiave primaria con più di un attributo). Potresti fare quanto segue

CREATE TABLE Report_has_Items(
    ReportID int references Report(ReportID), 
    ItemID int references Item(ItemID), 
    PRIMARY KEY (ReportID , ItemID) 
); 

Nota: La coppia (ReportID, ItemID) deve quindi essere univoco per la tabella e né valore può essere NULL.

Here is a very useful link for SQL Queries

5

Diamo un nome ai nostri vincoli, eh?

CREATE TABLE dbo.Report_has_Items(
    ReportID int NOT NULL, 
     CONSTRAINT [FK_RHI_Report] (ReportId) REFERENCES dbo.Report(ReportID), 
    ItemID int NOT NULL, 
     Constraint [FK_RHI_Item] (ItemId) REFERENCES dbo.Item(ItemID), 
    CONSTRAINT [PK_RHI] PRIMARY KEY (ReportID, ItemID) 
) 
+0

Qual è il vantaggio della denominazione di un vincolo? – Kairan

+1

@Kairan - Un vantaggio principale è che se una query (inserire, aggiornare, eliminare) viola un vincolo, verrà generato un messaggio di errore con il nome del vincolo. Se il nome del vincolo è chiaro e descrittivo, il messaggio di errore sarà più facile da capire; se il nome del vincolo è casuale, sarebbe meno chiaro. – Gayu

+0

Il motivo principale per me è la coerenza tra gli ambienti. Sono un DBA di supporto. Parte di quel lavoro è la migrazione delle modifiche da DEV a QA a PROD. Io uso uno strumento di confronto dello schema per questo. È bello se i vincoli vengono denominati allo stesso modo in modo che le differenze nella denominazione non vengano contrassegnate come differenze. –

Problemi correlati