主鍵(PRIMARY KEY)
主鍵在一個數據表中只能有唯一的一個,約束當前字段的值不能重復,且非空保證數據的完整性,也可以當做當前數據表的標識符用來查詢(當做索引,唯一性索引的一種)
創建帶主鍵的表
/*帶主鍵*/ CREATE TABLE T( id int(11) not null primary key, name char(20) ); /*帶復合主鍵*/ CREATE TABLE T( id int(11) not null , name char(20) not null, primary key(id,name) ); /*主鍵遞增*/ CREATE TABLE T( id int(11) primary key not null auto_increment , name char(20) not null, ); /*給已有表添加主鍵*/ alter table t add primary key(id);
外鍵(FORGEIGN KEY)
外鍵起的作用就是讓你在數據庫幫助的情況下更合理的添加數據的正確度。、MySQL中“鍵”和“索引”的定義相同,所以外鍵和主鍵一樣也是索引的一種。不同的是MySQL會自動為所有表的主鍵進行索引,但是外鍵字段必須由用戶進行明確的索引。用於外鍵關系的字段必須在所有的參照表中進行明確地索引,InnoDB不能自動地創建索引。
外鍵的好處:可以使得兩張表關聯,保證數據的一致性和實現一些級聯操作。保持數據一致性,完整性,主要目的是控制存儲在外鍵表中的數據。 使兩張表形成關聯,外鍵只能引用外表中的列的值!可以使得兩張表關聯,保證數據的一致性和實現一些級聯操作;
(轉)
//
1,在大型系統中(性能要求不高,安全要求高),使用外鍵;在大型系統中(性能要求高,安全自己控制),不用外鍵;小系統隨便,最好用外鍵。
2,用外鍵要適當,不能過分追求
3,不用外鍵而用程序控制數據一致性和完整性時,應該寫一層來保證,然后個個應用通過這個層來訪問數據庫。
需要注意的是:MySQL允許使用外鍵,但是為了完整性檢驗的目的,在除了InnoDB表類型之外的所有表類型中都忽略了這個功能。這可能有些怪異,實際上卻非常正常:對於數據庫的所有外鍵的每次插入、更新和刪除后,進行完整性檢查是一個耗費時間和資源的過程,它可能影響性能,特別是當處理復雜的或者是纏繞的連接樹時。因而,用戶可以在表的基礎上,選擇適合於特定需求的最好結合。所以,如果需要更好的性能,並且不需要完整性檢查,可以選擇使用MyISAM表類型,如果想要在MySQL中根據參照完整性來建立表並且希望在此基礎上保持良好的性能,最好選擇表結構為innoDB類型
一般數據庫屬於持久層,盡量把業務邏輯轉移到應用層,外鍵會使表之間耦合太大,所以建議靠程序去檢測和數據庫的事務來保證數據的完整性和一致性;另外外鍵需要額外的資源進行數據完整性和一致性檢驗,更容易造成死鎖,數據庫更容易達到瓶頸,特別是表的擴展能力大大受限。
當然也要看你的系統,如銀行系統等需要很高的安全性和可靠性還是建議使用外鍵,另外利用外鍵檢測數據還能減少程序開發量;但是大部分web項目都是追求體驗、性能,對數據並不是非常嚴格,還是不建議使用;
innoDB 是目前mysql中唯一支持外鍵的內置存儲引擎。使用外鍵是需要成本的,比如外鍵通常都要求每次在修改數據時都要在另一張表中多執行一次查詢操作。雖然innoDB強制外鍵使用索引,但還是無法消除這種約束檢查的開銷。如果外鍵列的選擇性很低,則會導致一個非常大的且選擇性很低的索引。
不過在某些場景下,外鍵回提升一些性能。如果想要確保兩個相關的表始終有一致的數據,那么使用外鍵要比應用程序中檢查一致性的性能要高的多,此外,外鍵在相關數據的更新和刪除上,要比應用中維護要更高效,不過,外鍵維護操作是逐步進行的,所以這樣的更新要比批量的更新和刪除要慢一些
外鍵約束會需要一些額外的鎖。容易導致死鎖。而且這類死鎖問題很難排查。
外鍵會帶來很大的額外消耗。對性能有很大的影響。
/*能夠在創建表的時候創建,也能夠在創建表之后創建。 創建表時創建:*/ create table student (id int primary key, name char(4), dept char(9) sex char(4)) create table grade (id int , grade int constraint id_fk foreign key (id) references student (id) ) /*或創建了兩表之后再建*/ alter table grade add constraint id_fk foreign key (id) references student (id)