2011-09-08 95 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

第二種語法使您可以在將來的某個時刻刪除,修改或重新使用該約束。

第一個語法無法更改,因爲它在表的定義中。

相關問題