在資料庫表中,如果有一組欄位能夠唯一確定一條記錄,則可以把它們設計成表格的主鍵欄位。
範例:如果要建立一個人的資訊表(欄位:姓名,年齡,籍貫,工作單位...),那麼身分證號是唯一能確定你這個人的,所以身分證字號是主鍵。
主鍵欄位名稱primary key
原則上使用一個欄位做主鍵,而且建議使用沒有業務意義的欄位做主鍵,例如:id等。
主鍵欄位的型別和長度由主鍵值的產生方式來決定:
1.4.1)
自增:使用資料庫本身主鍵產生機制
數值型長度由資料量決定
建立:主鍵欄位名稱primary key not null auto_increment
#。
優點:開發效率高,因為其可自動編號且依序存放便於擷取佔用空間小,可節省開發人員時間。 缺點: 運作效率低且不靈活,因為其自動成長,在手動要插入或導入指定ID的資料時會很麻煩且如果資料量過大那麼越到後面,資料庫自增主鍵的時間會變長導致查詢資料庫的操作變慢。如果有合併表的操作時,有機率也會出現主鍵的重複。 1.4.2)assighed:程式設計師手動產生主鍵值,唯一非空,演算法.hi/low:數值型長度由資料量決定
UUID :字串長度是32位元
public class UUIDUtil {//java中自带UUID的算法 public static String getUUID(){ return UUID.randomUUID().toString().replaceAll("-", ""); } }特點:優點:主鍵值產生很靈活且能夠保證在任何情況下都具有唯一性,資料遷移方便。 缺點上:佔用空間時長1.4.4)組合主鍵:由多個欄位的型別和長度決定 二.外鍵:2.1)外鍵定義:通常用於在兩個表之間建立關係。外鍵的主要用途是維持實體的兩個獨立實例之間的資料完整性。 2.2)外鍵(約束)建立(不建議使用,一般不進行外鍵約束,只進行外鍵約定):alert table 主鍵表名add constraint FK_ID(外鍵名稱) foreign key(外鍵欄位名稱) references 外表表名(主鍵欄位名稱) 2.3)外鍵出現的狀況:補充:
在建立表格的時候,表和表之間可能會存在的業務關係(關聯關係),這時會產生外鍵。
父表 子表
tbl_student name
1001 zs 111 111 class1
1002 ls ##1003 ww 222
1004 zl
//查询所有姓张的学生的id,name和所在班级name select s.id,s.name,c.name as className from tbl_student s join tbl_class c on s.class_id=c.id//假如外键不可以为空 where s.name like 'z%'
2.3.2)在一对一中:
tbl_person tbl_card
id name id name
1001 zs 1001 card1
特点:
a)共享主键:(不推荐)
添加数据:先添加先产生的表,再后产生的表记录
删除数据:先删除后产生的表记录,再删除先产生的表记录
查询数据:无需进行连接查询:
//查询zhangsan的驾照信息 1001 select * from tbl_card where id='1001'
2.3.3)多对多:
tbl_student tbl_course
id name id name
1001 zs 111 java
1002 ls 222 mysql
tbl_student_course_relation
student_id course_id
1001 111
1001 222
1002 111
1002 222
特点:
添加数据时,先添加父表记录(tbl_student,tbl_course),再添加子表(tbl_student_course_relation)记录;
删除数据时,先删除子表记录(tbl_student_course_relation),再删除父表记录(tbl_student,tbl_course)
查询数据时,可能会进行关联查询:
//查询所有姓张的学生的id,name,和所选课程的name select s.id,s.name,c.name as courseName from tbl_student s join tbl_student_course_relation scr on s.id=scr.student_id join tbl_course c on scr.course_id=c.id where s.name like 'z%'
以上是MySQL語句中的主鍵與外鍵怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!