2 Stimmen

Datenbankdesign - Wie kann ich einen Fremdschlüssel des Primärschlüssels in derselben Tabelle haben?

In meiner Datenbank sollen alle Abteilungen meines Unternehmens gespeichert werden.

Einige Abteilungen sind Unterabteilungen einer anderen bestehenden Abteilung. Ich habe beschlossen, dies wie folgt zu lösen:

Departments
ID Description HeadOfDepartment ParentDepartment

ParentDepartment kann null sein, was bedeutet, dass es sich um eine Root-Abteilung handelt. Wenn sie eine übergeordnete Abteilung hat, werde ich entsprechend handeln. Meine Frage ist, wie kann ich dies in Microsoft SQL codieren?

4voto

Jorge Ferreira Punkte 92489
CREATE TABLE Departments 
(
    ID integer primary key, 
    Description varchar(255), 
    HeadOfDepartment varchar(255), 
    ParentDepartment integer references Departments(ID)
);

1voto

Cade Roux Punkte 85601

Fremdschlüssel in SQL Server dürfen entweder NULL ODER ein gültiger Schlüssel in der entsprechenden Tabelle sein.

CREATE TABLE [hierarchytest](
    [ID] [int] NOT NULL,
    [ParentID] [int] NULL,
 CONSTRAINT [PK_hierarchytest] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
))
GO
ALTER TABLE [hierarchytest]  WITH CHECK ADD  CONSTRAINT [FK_hierarchytest_hierarchytest] FOREIGN KEY([ParentID])
REFERENCES [hierarchytest] ([ID])
GO
ALTER TABLE [hierarchytest] CHECK CONSTRAINT [FK_hierarchytest_hierarchytest]

0voto

Nathan Wheeler Punkte 5836

Wenn Sie einen Fremdschlüssel erstellen und ihn erzwingen, dürfen Sie keine Nullwerte in das Fremdschlüsselfeld eingeben. Wenn ich so etwas implementieren würde, würde ich die Fremdschlüsselbeschränkung erzwingen und einfach den Fremdschlüsselwert einer Abteilung ohne übergeordneten Schlüssel mit dem eigenen Primärschlüssel füllen. Das sollte erlaubt sein.

CREATE TABLE Departments 
(
    Id INT PRIMARY KEY, 
    Description VARCHAR(255), 
    HeadOfDepartment VARCHAR(255), 
    ParentDepartment INT NOT NULL REFERENCES Departments(Id)
);

-1voto

AxelEckenberger Punkte 16238

Erstellen Sie einen Fremdschlüssel für ParentDepartment die auf die ID-Eigenschaft der Tabelle verweist.

CREATE TABLE dbo.Departments
    (
    ID int NOT NULL IDENTITY (1, 1),
    Description nvarchar(100) NOT NULL,
    HeadOfDepartment nvarchar(100) NOT NULL,
    ParentDepartment int NULL
    )  ON [PRIMARY]

ALTER TABLE dbo.Departments ADD CONSTRAINT
    PK_Departments PRIMARY KEY CLUSTERED 
    (
    ID
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

ALTER TABLE dbo.Departments ADD CONSTRAINT
    FK_Departments_Departments FOREIGN KEY
    (
    ParentDepartment
    ) REFERENCES dbo.Departments
    (
    ID
    ) ON UPDATE  NO ACTION 
     ON DELETE  NO ACTION

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X