1. 程式人生 > >表的主鍵與外來鍵

表的主鍵與外來鍵

 

一個關係表事實上是具有共同屬性的一類實體的集合。按照集合的定義,集合中元素不能重複。同樣,關係表中也不應該有重複記錄。例如在學生表中,存有兩條一樣的學生記錄是不必要的,也是不合適的。

在現實世界中,除了事物本身的資訊外,事物之間還存在著很多聯絡,這種聯絡反映到資料庫中就體現為表之間的聯絡。例如在圖1中,學生表儲存學生資訊,系表儲存系的資訊。但學生表和系表之間是有聯絡的:每個學生都屬於一個系,而每個系都可以包含多名學生,所以學生表和系表就存在著“屬於”的聯絡。

(圖1)

在關係資料庫中,如何儲存這種聯絡的資訊呢?就要藉助“外來鍵”實現。如果一個表中的某一列是另外一個表的中的主鍵,那麼稱這列為外來鍵。例如圖1學生表中“系號”就是外來鍵,因為系號是系表的主鍵(建立主外來鍵關係的前提是兩張表中有相同的欄位和屬性

)。在學生表中設計了“系號”一列,就是為了儲存學生和系之間的聯絡資訊。

外來鍵就是連線兩個表的紐帶。通過外來鍵和主鍵的等值連線,如圖1,就可以將不同表裡的相關紀錄連線在一起,從而實現了資料庫中相關資料的查詢。利用外來鍵,可以查詢每個學生所在系的資訊,也可以查詢在制定的系所包含的學生資訊。

當兩個表通過“外來鍵-主鍵”建立了聯絡之後,就要保持兩表資料的一致性。例如在插入學生記錄的同時,外來鍵的值(系號)必須是系表中主鍵的有效值(必須有這個系),或者是空值(學生的系暫未確定);又如,在刪除系表記錄時,如果在學生表裡還有該系學生的記錄(該系還有學生在就讀),那麼系記錄就不能刪除。

下面再分析一個員工資訊管理系統的例子。該資料庫中建有員工基本資訊表(person)、部門編碼表(deparment)和學歷編碼表(education),如圖2所示:

(圖2)

部門編碼表儲存了部門編號和部門名稱,部門編號(DepID)是主鍵,每個部門的編號在表中具有唯一性,這樣就能保證每行都可以用主鍵來標識。

學歷編碼表儲存了學歷編號和學歷名稱,學歷編號(EduID)是主鍵。

員工基本資訊表儲存員工的基本資訊,需要包括工作證號、姓名、部門編號、職務、工資、學歷編號等欄位,工作證號(ID)是該表的主鍵。在該表中,Department列是一個外來鍵,匹配部門編碼表中的DepID主鍵;Education列也是一個外來鍵,匹配學歷編碼表中的EduID主鍵。利用外來鍵和主鍵的連線,就可以查詢出某人,如張三的部門是經理室,他的學歷室碩士。

利用“外來鍵-主鍵”的連線方式能更好奪得簡化資料庫設計過程,減少資料冗餘,提高資料庫效率。

相關推薦

外來

  一個關係表事實上是具有共同屬性的一類實體的集合。按照集合的定義,集合中元素不能重複。同樣,關係表中也不應該有重複記錄。例如在學生表中,存有兩條一樣的學生記錄是不必要的,也是不合適的。 在現實世界中,除了事物本身的資訊外,事物之間還存在著很多聯絡,這種聯絡反映到資料庫中就

資料庫中的外來的關係,通俗易懂

一、什麼是主鍵、外來鍵: 關係型資料庫中的一條記錄中有若干個屬性,若其中某一個屬性組(注意是組)能唯一標識一條記錄,該屬性組就可以成為一個主鍵比如學生表(學號,姓名,性別,班級) 其中每個學生的學號是唯一的,學號就是一個主鍵課程表(課程編號,課程名,學分) 其中課程編號是

索引,外來的關係

簡單來講 : 主鍵用來標識記錄,索引用來加速查詢。  主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵     所謂主鍵就是能夠唯一標識表中某一行的屬性或屬性組,一個表只能有一個主鍵,但可以有多個候選索引。因為主鍵可以唯一標識某一行記錄,所以可以確保執行資料更新、刪除的時

資料庫的外來

一、定義    主鍵:在資料表中可以作為唯一標識的欄位,不能有重複的,不允許為空。           如:學生表(學號,姓名,性別,班級) 其中每個學生的學號是唯一的,學號    就是一個主鍵 ;    外來鍵:表的外來鍵是另一表的主鍵用於保持資料的一致性, 外來鍵可以有重

(八)MySQL基礎——外來、修改時新增刪除約束、標識列

一、主鍵和唯一的區別:   保證唯一性 是否允許為空 一個表可以有多少個 是否允許組合 主鍵 √ × 至多有1個 √,但不推薦

MySql必知必會實戰練習(四)外來、sql約束、聯結 MySql資料庫約束

  本博將對主鍵、外來鍵、MySql資料庫約束和聯結表的相關特性進行總結和實戰 1. 主鍵   表中的每一行都應該具有可以唯一標識自己的一列(或一組列),而這個承擔標識作用的列稱為主鍵   如果沒有主鍵,資料的管理會十分混亂。比如會存在多條一模一樣的記錄,刪除和修改特定行十分困難 (1)哪些列可以作為

Mysql資料庫——資料的優化、外來三正規化

資料表優化 將商品資訊表進行優化 1.建立商品種類表: create table if not exists goods_cates( id int unsigned primary key auto_increment, name

【資料庫】外來,主表,從,關聯,父,子

轉自:https://www.2cto.com/database/201707/662425.html 一、前言 在資料庫設計中,hibernate,iBatis等ORM框架的使用中經常聽說主鍵,外來鍵,主表,從表,關聯表,父表,子表之類的術語,弄懂它們之前的區別與聯絡對於資料庫設計和ORM框架的學習使用

Oracle中給新增外來

1、建立表的同時建立主鍵約束 (1)無命名 create table student ( studentid int primary key not null, studentname varchar(8), age int); (2)有命名 create tab

Oracle 中給新增外來

(1)無命名 create table student ( studentid int primary key not null, studentname varchar(8), age int); (2)有命名 create table students ( studentid int , stu

資料庫的主表,從外來等之間的關係

主鍵:一般情況下,滿足第一正規化的表都有一個主鍵Primary key,用於唯一標示資料庫中的一個欄位。外來鍵:外來鍵是相對於資料庫設計中的參考完整性而言,它與主鍵之間是彼此依賴的關係。假設現在有兩個表,產品分類表ProductCategory(主鍵c_id)和產品表Product(主鍵p_id),每類產品都

ORACLE 建外來,建的基本語法

建立表格語法:     create table 表名(        欄位名1    欄位型別(長度)       是否為空,        欄位名2    欄位型別                

Oracle-約束、唯一約束外來約束

          1.主鍵約束: 一個表只能有一個主鍵約束。主鍵可以是單個欄位,也可以是多個欄位。無論是哪種情況,其所有欄位都是NOT NULL。           2.Unique約束:一個表可以有多個Unique約束,Unique的欄位可以為NULL。        

外來,主表,從,關聯,父,子

主從表是一種資料關係模型,主表約束從表。以學員資訊表stuInfo和考試成績表stuMarks為例, 我們知道它們是一對多的關係,當然一是主,多是從。(譬如我們的胡主席是主,我們大家都要聽主席的話!)所以stuInfo就是主表,stuMarks就是從表。那麼,一般我們會在從表中做一個外來鍵欄位,引用主表中的主

SQL入門(5)——的設計、外來

定義主鍵約束(每一個表必須有一個主鍵列) create table student (id int  primary key,name varchar(40) ); 定義主鍵自動增長 create table student (id int  primary key auto_increment,name v

解決 添加數據 spec 毫無 har 程序 同時 次數 rom 轉自:http://www.cnblogs.com/longyi1234/archive/2010/03/24/1693738.html 一、什麽是主鍵、外鍵: 關系型數據庫中的一條記錄中有若幹個屬性,

MySQL資料庫中外來的操作

在MySQL資料庫中,一般會涉及到主鍵和外來鍵,在上一個表中添加了主鍵之後,通常在下一個表中要新增外來鍵,但是添加了外來鍵之後,在實體類和資料庫中在加上上一個表的主鍵會比較好,這樣兩個表關聯之後,在上一個表查詢完成之後,將查詢是出來的欄位拿著去下一個庫裡查詢,會比較好。 select * fro

MySQL—概念,使用者的建立,外來,資料型別,表格建立

MySQL   DBMS,MySQL的概念,資料庫分類,以前MySQL的部署中的一些概念 #DBMS:資料庫管理系統,用於管理資料庫的大型軟體。mysql就是dbms的一種 #Mysql:是用於管理檔案的一個軟體 #服務端軟體

關係外來約束

關係 建立成績表scores,結構如下     id    學生    科目    成績 思考:學生列應該存什麼資訊呢? 答:學生列的資料不是在這裡新建的,而應該從學生表引用過來,關係也是一條資料;根據正規化要求應該儲存學生的編號,而不是學生的姓名等其它資訊 同理,科目表也是關係

oracle匯入資料時遇到外來約束問題導致匯入失敗

1、先關掉所有外來鍵約束: SELECT 'alter table  '|| t.table_name || ' disable constraint ' || t.CONSTRAINT_NAME || ';' FROM USER_CONSTRAINTS t WHERE t.CONST