我有这些数据库
=== 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的外键。那么如何编写该命令呢?任何帮助和建议将受到高度赞赏。
答案 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);