5

Jeśli zadeklaruję poniższą tabelę, domyślnie oznacza to, że oba klucze obce tworzą unikalny klucz podstawowy lub czy muszę zrobić coś więcej, aby oba atrybuty były kluczem podstawowym?Wielokrotne klucze obce SQL jako klucze główne

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

Zasadniczo oba atrybuty, które są obcymi kluczami z innych tabel, tworzą razem unikatowy klucz.

Odpowiedz

9

Nie, nie ma. Powyższa tabela nie ma klucza podstawowego. Jeśli chcesz użyć pól jako klucza podstawowego, użyj:

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

lub coś podobnego w zależności od twojego sql dilect.

3

Nie jestem pewien, czy rozumiem Twoje pytanie całkowicie, ale zakładam, że próbujesz utworzyć złożony klucz podstawowy (klucz podstawowy z więcej niż jednym atrybutem). Możesz wykonać następujące czynności.

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

Uwaga: Para (ReportId, ItemID) musi być unikalny dla tabeli i nie może być wartością NULL.

Here is a very useful link for SQL Queries

5

Nazwijmy nasze ograniczenia, 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

Jakie są zalety nazywania ograniczenia? – Kairan

+1

@Kairan - Jedną z głównych korzyści jest to, że jeśli zapytanie (wstawianie, aktualizacja, usuwanie) narusza ograniczenie, zostanie wygenerowany komunikat o błędzie z nazwą ograniczenia. Jeśli nazwa ograniczenia jest jasna i opisowa, komunikat o błędzie będzie łatwiejszy do zrozumienia; jeśli nazwa ograniczenia jest losowa, byłaby mniej jasna. – Gayu

+0

Głównym powodem dla mnie jest spójność w różnych środowiskach. Jestem wsparciem DBA. Częścią tego zadania jest migracja zmian z DEV na QA na PROD. Używam do tego narzędzia do porównywania schematów. Dobrze, jeśli ograniczenia są nazywane tymi samymi, więc różnice w nazewnictwie nie są oznaczone jako różnice. –

Powiązane problemy