2012-07-12 84 views
4

如果一個博客有一個「類」表如下所示:是否可以在同一個表中引用不同的列?

CREATE TABLE categories 
(
    id INTEGER PRIMARY KEY AUTO_INCREMENT, 
    parent_id INTEGER NOT NULL, 
    name VARCHAR(30) NOT NULL, 
    description TEXT, 
    count INTEGER NOT NULL DEFAULT 0 
); 

而且如果PARENT_ID場是指在類別表中的「ID」字段,然後我又怎能添加約束這將確保插入到parent_id中的值引用id字段?

我只是想確保只有存在的類別id值可以用作新插入類別的父項。

回答

7

是的,你可以引用同一張表中的一列。

但是該列應該是可以爲空的,否則不能插入第一條記錄。

CREATE TABLE categories 
(
    id INTEGER PRIMARY KEY AUTO_INCREMENT, 
    parent_id INTEGER NULL, 
    name VARCHAR(30) NOT NULL, 
    description TEXT, 
    count INTEGER NOT NULL DEFAULT 0, 
    FOREIGN KEY (parent_id) REFERENCES categories(id) 
); 

注意,參考關鍵字後面的表名是不可選的,所以你必須指定它,即使你引用在同一個表中的列。從documentation

 
reference_definition: 
    REFERENCES tbl_name (index_col_name,...) 
     [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] 
     [ON DELETE reference_option] 
     [ON UPDATE reference_option] 

看到它聯機工作:sqlfiddle

+0

這是否意味着我應該這樣做:PARENT_ID INTEGER參考(ID)? – 2012-07-12 20:10:55

+0

@JimJohnson:你需要指定表名。 – 2012-07-12 20:16:19

1

只需使用一個正常的外鍵:

ALTER TABLE categories ADD CONSTRAINT FK_categories_Parent_ID 
REFERENCES categories (ID) 

然而PARENT_ID應爲空的,你永遠無法插入記錄

+0

我從來不知道外鍵也可能是同一個表中的列。< – 2012-07-12 20:14:25

+0

我可以將parent_id默認爲0嗎? – 2012-07-12 20:15:05

+2

@JimJohnson:你的桌子上有0排嗎?如果不是,如果嘗試添加parent_id = 0的行,則您的外鍵約束將失敗。但是,您可以使用NULL。 – 2012-07-12 20:16:53

相關問題