2013-07-26 59 views
1

我還沒有真的在我的數據庫中使用過外鍵,我總是隻寫代碼來強制執行我的操作,但我正在尋求將某些邏輯轉移到數據庫並學習更多關於外鍵的知識。在同一張表上的SQL中的關係

我現在有它具有表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時,它將成爲主列,並且在這種情況下哪個是外國列?

+0

'我從來沒有真的在我的數據庫中使用外鍵' - 哇,+1的勇敢的聲明!現在快速做一些事情。 – OzrenTkalcecKrznaric

+0

@Ozren在一些商店中禁止使用外鍵,因爲它們「減慢了速度」。 –

+0

@AaronBertrand:在這個頁面上有兩個非常有趣的陳述,我覺得他們很難相信;你的真實故事和FK放慢了速度:D – OzrenTkalcecKrznaric

回答

6

我認爲ParentCategoryID必須是NULL(除非你想要一個頂級父指向自己,這沒有多大意義)。

ALTER TABLE dbo.Categories 
    ADD CONSTRAINT FK_SelfParent 
    FOREIGN KEY (ParentCategoryID) 
    REFERENCES dbo.Categories(CategoryID); 

真實故事:在面試微軟(幾年前),在SQL Server的人告訴我,這是不可能的。

+0

'ParentCategoryID'默認爲'0'(零)而不是'NULL'。儘管我能儘快接受。謝謝 – bizzehdee

+2

然後你不能有一個外鍵,因爲它必須是NULL或*有效*值。由於您的IDENTITY列從1開始,因此我們可以假設CategoryID = 0不存在。 –

相關問題