Проектирование базы данных - Как я могу иметь внешний ключ первичного ключа в той же таблице? - PullRequest
2 голосов
/ 18 мая 2010

В моей базе данных должны храниться все доступные отделы в моей компании.

Некоторые отделы являются подразделениями другого существующего отдела. Я решил решить это так:

Departments
ID Description HeadOfDepartment ParentDepartment

ParentDepartment может быть нулевым, указывая, что это корневой отдел. Если у него есть родитель, я буду действовать соответственно, мой вопрос, как я могу написать это в Microsoft SQL?

Ответы [ 4 ]

4 голосов
/ 18 мая 2010
CREATE TABLE Departments 
(
    ID integer primary key, 
    Description varchar(255), 
    HeadOfDepartment varchar(255), 
    ParentDepartment integer references Departments(ID)
);
1 голос
/ 18 мая 2010

Внешние ключи в SQL Server могут иметь значение NULL или действительный ключ в соответствующей таблице.

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]
0 голосов
/ 18 мая 2010

Если вы создадите внешний ключ и введете его в действие, то вам не разрешат помещать нулевые значения в поле внешнего ключа. Если бы я реализовал что-то подобное, я бы применил ограничение внешнего ключа и просто заполнил значение внешнего ключа отдела без родителя своим собственным первичным ключом. Это должно быть разрешено.

CREATE TABLE Departments 
(
    Id INT PRIMARY KEY, 
    Description VARCHAR(255), 
    HeadOfDepartment VARCHAR(255), 
    ParentDepartment INT NOT NULL REFERENCES Departments(Id)
);
0 голосов
/ 18 мая 2010

Создайте внешний ключ на ParentDepartment, который ссылается на свойство идентификатора таблицы.

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...