2012-02-13 74 views
1

我有這些數據庫聲明外鍵在MySQL

=== Invoices === 
    id 
    status 
    description 

    === Invoice Items === 
    id 
    invoice_id (FK) 
    item_name 
    description 

爲了讓這個表我有此MySQL命令

CREATE TABLE IF NOT EXISTS `nt_invoices` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `status` varchar(45) NOT NULL DEFAULT '', 
    `description` text NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=24 ; 


CREATE TABLE IF NOT EXISTS `nt_invoice_items` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `invoice_id` int(11) NOT NULL, 
    `item_name` varchar(45) NOT NULL, 
    `description` text NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `invoice_id` (`invoice_id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ; 

我的問題是,我想聲明的invoice_items的外鍵表並使invoice_id表的外鍵爲invoices。那麼如何編寫該命令?任何幫助和建議將不勝感激。

回答

1

您應該有innodb使用外鍵的引擎類型。

CREATE TABLE IF NOT EXISTS `nt_invoice_items` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `invoice_id` int(11) NOT NULL references nt_invoices(id) 
    `item_name` varchar(45) NOT NULL, 
    `description` text NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `invoice_id` (`invoice_id`) 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 

或者如果你想使用級聯更新刪除:

CREATE TABLE IF NOT EXISTS `nt_invoice_items` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `invoice_id` int(11) NOT NULL, 
    `item_name` varchar(45) NOT NULL, 
    `description` text NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `invoice_id` (`invoice_id`), 
FOREIGN KEY (invoice_id) REFERENCES nt_invoices(id) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 

) ENGINE=INNODB DEFAULT CHARSET=utf8; 
3

MyISAM不支持外鍵。你需要使用InnoDB(無論如何,這是一個更好的選擇)。然後它就像其他任何SQL語言一樣:

`invoice_id` int(11) NOT NULL references nt_invoices(id), 

P.S.另外,總是使用utf8編碼無處不在。如果你不這樣做,它會咬你。

+1

+1捕捉MyISAM的問題 – drnewman 2012-02-13 08:44:48

0

您還可以使用ALTER命令來聲明FOREIGN KEY如下:

Alter table table_name add foreign key(column_name) 
    references other_table_name(column);