2012-02-13 1 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

0

Вы также можете использовать команду ALTER объявить FOREIGN KEY следующим образом:

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