SQL中同一表上的关系

SQL中同一表上的关系,sql,sql-server,tsql,Sql,Sql Server,Tsql,我从来没有在我的数据库中真正使用过外键,我总是写一些代码来为我执行一些事情,但我希望将一些逻辑转移到数据库中,并学习更多关于外键的知识 我目前有一个数据库,其中包含表Categories: CREATE TABLE [dbo].[Categories]( [CategoryID] [bigint] IDENTITY(1,1) NOT NULL, [ParentCategoryID] [bigint] NOT NULL, [CategoryStatus] [bit] NOT

我从来没有在我的数据库中真正使用过外键,我总是写一些代码来为我执行一些事情,但我希望将一些逻辑转移到数据库中,并学习更多关于外键的知识

我目前有一个数据库,其中包含表
Categories

CREATE TABLE [dbo].[Categories](
    [CategoryID] [bigint] IDENTITY(1,1) NOT NULL,
    [ParentCategoryID] [bigint] NOT NULL,
    [CategoryStatus] [bit] NOT NULL,
    [CategoryTitle] [varchar](64) NOT NULL,
    [CategorySlug] [varchar](64) NOT NULL,
    [CategoryThumbnail] [varchar](128) NULL,
    [CategoryHeaderImage] [varchar](128) NULL,
    [CategoryDescription] [text] NULL,
 CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED 
(
    [CategoryID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
 CONSTRAINT [UI_Categories_Slug] UNIQUE NONCLUSTERED 
(
    [CategorySlug] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

我想创建一个与
ParentCategoryID
相关的外键,备份到
CategoryID
。在创建FK时,在本例中,哪个是主列,哪个是外部列?

我认为
ParentCategoryID
必须能够
NULL
(除非您希望顶级父级指向自身,这没有多大意义)


真实故事:几年前,在微软的一次求职面试中,一位SQL Server人员告诉我这是不可能的。

ParentCategoryID
默认为
0
(零),而不是
NULL
。但我会尽快接受。感谢您不能有外键,因为它必须为NULL或有效值。由于您的标识列从1开始,我们可以假设CategoryID=0不存在。“我从来没有在数据库中真正使用过外键”-哇,+1代表一个勇敢的声明!现在赶快做点什么吧。@Ozren在一些商店里禁止使用外键,因为它们“会让事情变慢”。@AaronBertrand:这一页上有两种说法非常有趣,我觉得很难相信;你的真实故事和FK放慢了速度:D@OzrenTkalčecKrznarić:在mysql 3.x和php 3.x时代,我一直是一名php/mysql开发人员,从未真正了解过数据库中我不需要的东西。数据库设计是编程的一个领域,一旦我把它放上去,我就把它大部分地保留下来,现在我正试图大量地提高我的知识,以赶上我在PHP、C语言、C++以及其他所有东西中所学到的进步。
ALTER TABLE dbo.Categories
  ADD CONSTRAINT FK_SelfParent
  FOREIGN KEY (ParentCategoryID)
  REFERENCES dbo.Categories(CategoryID);