SQL中的关系在同一个表上

biz*_*dee 1 sql t-sql sql-server

我没有真正在我的数据库中使用外键,我总是只编写能够为我强制执行的代码,但我希望将一些逻辑转移到数据库并学习更多有关外键的知识.

我目前有一个包含表格的数据库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]
Run Code Online (Sandbox Code Playgroud)

我想创建一个涉及一个外键ParentCategoryID备份到CategoryID.创建FK时,哪个是主列,哪个是本例中的外来列?

Aar*_*and 6

我认为ParentCategoryID必须NULL能够(除非你想让一个顶级父母指向自己,这没有多大意义).

ALTER TABLE dbo.Categories
  ADD CONSTRAINT FK_SelfParent
  FOREIGN KEY (ParentCategoryID)
  REFERENCES dbo.Categories(CategoryID);
Run Code Online (Sandbox Code Playgroud)

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

  • 然后你不能有一个外键,因为它必须是NULL或*有效*值.由于您的IDENTITY列从1开始,我们可以假设CategoryID = 0不存在. (2认同)