2011-09-08 89 views
1

早上好,我在研究SQL,今天我发现了两种声明外键的方法(对于MySQL)。我想知道它在这两种语法之间会发生什么变化,为什么我需要为外键设置一个名称(语法2)。这两种声明外键的方法有什么不同?

语法1:

CREATE TABLE `test2` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`idtest` int(10) unsigned NOT NULL, 
`desc` varchar(45) NOT NULL, 
PRIMARY KEY (`id`), 
FOREIGN KEY (`idtest`) REFERENCES `test` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

语法2:

CREATE TABLE `test2` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`idtest` int(10) unsigned NOT NULL, 
`desc` varchar(45) NOT NULL, 
PRIMARY KEY (`id`), 
KEY `FK_1` (`idtest`), 
CONSTRAINT `FK_1` FOREIGN KEY (`idtest`) REFERENCES `test` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

谢谢!

+0

他们只是表达2的同样的事情的方式。表达FK的第一种方式将作为您在那里输入的第二种形式来实现,换句话说,它们将作为约束来实现。 – Icarus

+0

@Icarus无论您是否拥有'CONSTRAINT'关键字,它都是一个约束。 – NullUserException

回答

1

功能上没有区别。

  • 第一个例子没有命名外键,但它是命名的RDBMS。
  • 第二个例子可以让你明确地命名外键。

命名外键的能力,你自己可以让你给其他开发者传达什么样的关键手段,并符合标准命名约定,等

+0

非常感谢! –

1

第二种语法使您可以在将来的某个时刻删除,修改或重新使用该约束。

第一个语法无法更改,因为它在表的定义中。

相关问题