Объявить внешний ключ в MySQL - PullRequest
1 голос
/ 13 февраля 2012

У меня есть эти базы данных

  === 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 идентификатора таблицы. Так как написать эту команду? Любая помощь и предложения будут высоко оценены.

Ответы [ 3 ]

3 голосов
/ 13 февраля 2012

MyISAM не поддерживает внешние ключи.Вам нужно использовать InnoDB (который в любом случае является лучшим выбором во всех аспектах).Тогда это так же, как в любом другом диалекте SQL:

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

PS Кроме того, всегда использует кодировку utf8 везде .Если ты этого не сделаешь, тебя укусят в задницу.

1 голос
/ 13 февраля 2012

У вас должен быть 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;
0 голосов
/ 22 августа 2013

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

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