在MySQL中声明外键

时间:2012-02-13 08:41:29

标签: mysql foreign-keys foreign-key-relationship

我有这些数据库

  === 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表id的外键。那么如何编写该命令呢?任何帮助和建议将受到高度赞赏。

3 个答案:

答案 0 :(得分:3)

MyISAM不支持外键。您需要使用InnoDB(无论如何都是更好的选择)。然后它就像任何其他SQL方言一样:

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

P.S。此外,始终使用utf8编码无处不在。如果你不这样做,它会咬你的屁股。

答案 1 :(得分: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;

答案 2 :(得分:0)

您也可以使用ALTER命令声明FOREIGN KEY,如下所示:

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