?一.主鍵:
1.1)主鍵字段定義:
在數(shù)據(jù)庫(kù)表中,如果有一組字段能夠唯一確定一條記錄,則可以把它們?cè)O(shè)計(jì)成表的主鍵字段。
例子:如果要?jiǎng)?chuàng)建一個(gè)人的信息表(字段:姓名,年齡,籍貫,工作單位......),那么身份證號(hào)是唯一能確定你這個(gè)人的,所以身份證號(hào)是主鍵。
1.2) 創(chuàng)建:
主鍵字段名 primary key
1.3)主鍵的選取原則;
原則上使用一個(gè)字段做主鍵,而且推薦使用沒(méi)有業(yè)務(wù)含義的字段做主鍵,比如:id等。
1.4)主鍵值的生成方式:
主鍵字段的類型和長(zhǎng)度由主鍵值的生成方式來(lái)決定:
?? ??? ? ? ? ? 1.4.1)自增:借助數(shù)據(jù)庫(kù)自身主鍵生成機(jī)制
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?數(shù)值型 長(zhǎng)度由數(shù)據(jù)量來(lái)決定
? ? ? ? ? ? ? ? ? ? ? ? 創(chuàng)建:主鍵字段名 primary key not null auto_increment
? ? ? ? ? ? ? ? ? ? ? ? 特點(diǎn):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 優(yōu)點(diǎn):開(kāi)發(fā)效率高,因?yàn)槠淇梢宰詣?dòng)編號(hào)且按順序存放便于檢索占用空間小,可以節(jié)省開(kāi)發(fā)人員時(shí)間。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?缺點(diǎn):?運(yùn)行效率低且不靈活,因?yàn)槠渥詣?dòng)增長(zhǎng),在手動(dòng)要插入或?qū)胫付↖D的數(shù)據(jù)時(shí)會(huì)很麻煩且如果數(shù)據(jù)量過(guò)大那么越到后面,數(shù)據(jù)庫(kù)自增主鍵的時(shí)間會(huì)變長(zhǎng)導(dǎo)致查詢數(shù)據(jù)庫(kù)的操作變慢。如果有合并表的操作時(shí),有概率還會(huì)出現(xiàn)主鍵的重復(fù)。
? ? ? ? ? ? ? ?1.4.2)assighed:程序員手動(dòng)生成主鍵值,唯一非空,算法.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?hi/low:數(shù)值型 長(zhǎng)度由數(shù)據(jù)量決定
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?UUID:字符串 長(zhǎng)度是32位
public class UUIDUtil {//java中自帶UUID的算法
public static String getUUID(){
return UUID.randomUUID().toString().replaceAll("-", "");
}
}
? ? ? ? ? ? ? ? ? ? ? ? ?特點(diǎn):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?優(yōu)點(diǎn):主鍵值生成很靈活且能夠保證在任何情況下都具有唯一性,數(shù)據(jù)遷移方便。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 缺點(diǎn):占用空間大,很難記憶,會(huì)降低性能。
? ? ? ? ? ? ?1.4.3)共享主鍵:由另一張表的類型和長(zhǎng)度決定
?? ??? ? ? ? ? ? ? ? ? tbl_person ? ? ? ? tbl_card
?? ??? ??? ? ? ? ? id ? ? name ? ? ? ?id ? ? name
?? ??? ??? ? ? ? ? 1001 ? zs ? ? ? ? ?1001 ? ?card1
?? ??? ??? ? ? ? ? 1002 ? ls
? ? ? ? ? ? ?1.4.4)聯(lián)合主鍵:由多個(gè)字段的類型和長(zhǎng)度決定
? ?二.外鍵:
2.1)外鍵定義:
通常用于在兩個(gè)表之間建立關(guān)系。外鍵的主要用途是維持實(shí)體的兩個(gè)獨(dú)立實(shí)例之間的數(shù)據(jù)完整性。
2.2)外鍵(約束)創(chuàng)建(不推薦使用,一般不進(jìn)行外鍵約束,只進(jìn)行外鍵約定):
alert table 主鍵表名 add constraint FK_ID(外鍵名稱) foreign key(外鍵字段名) references 外表表名(主鍵字段名)
?2.3)外鍵出現(xiàn)的情況:
補(bǔ)充:
?在創(chuàng)建表的時(shí)候,表和表之間可能會(huì)存在的業(yè)務(wù)關(guān)系(關(guān)聯(lián)關(guān)系),這時(shí)會(huì)產(chǎn)生外鍵。
關(guān)聯(lián)關(guān)系中存在的關(guān)系類型:
1對(duì)1:一張表(A)中的一條記錄只能對(duì)應(yīng)另一張表(B)中的一條記錄,另一張表(B)中的一條記錄也只能對(duì)應(yīng)一張表(A)中的一條記錄。?
? ? ? ? ? ? ??eg:軟工2777班和班長(zhǎng),公民和身份證。(商品表和該商品的描述表)
1對(duì)多:一張表(A)中的一條記錄可以對(duì)應(yīng)另一張表(B)中的多條記錄,另一張表(B)中的一條記錄只能對(duì)應(yīng)一張表(A)中的一條記錄。
? ? ? ? ? ? ? eg:商品的分類表和商品表示一對(duì)多的關(guān)系,一個(gè)商品分類下可以有多個(gè)商品,學(xué)生和班級(jí)
多對(duì)多:(有兩張表,A表中的一條數(shù)據(jù)對(duì)應(yīng)B表中的多條,同時(shí),B表中的一條對(duì)應(yīng)A表中的多條)
? ? ? ? ? ? ? eg:客戶表和部門表。
?關(guān)聯(lián)查詢(同時(shí)利用外鍵查詢多張表中的數(shù)據(jù))
?關(guān)聯(lián)查詢的類型:
內(nèi)連接:查詢所有符合條件的數(shù)據(jù),并且要求結(jié)果在兩張表中都有相對(duì)應(yīng)的記錄
左外連接:查詢左側(cè)表中所有符合條件的數(shù)據(jù),即使在右側(cè)表中沒(méi)有相對(duì)應(yīng)的記錄
右外連接:查詢右側(cè)表中所有符合條件的數(shù)據(jù),即使在左側(cè)表中沒(méi)有相對(duì)應(yīng)的記錄
? ? ? ? ? ? ? ? ? ? ? ? 2.3.1)在一對(duì)多中:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ?例子:A(1)---------B(n)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 父表 ? ? ? ? 子表
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??tbl_student ? ? ? ? ? ? ? ? ? ?tbl_class
? ? ? ? ? ? ? ? ? ? ? ? ? ? ??id ? ? ?name class_id ? ? ? ? ?id ? ? name
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1001 ? ?zs ? ?111 ? ? ? ? ? ? ?111 ? ?class1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1002 ? ?ls ? ?111 ? ? ? ? ? ? ?222 ? ?class2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1003 ? ?ww ? ?222
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1004 ? ?zl ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 特點(diǎn):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?添加數(shù)據(jù)時(shí),先添加父表記錄,再添加子表記錄;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?刪除數(shù)據(jù)時(shí),先刪除子表記錄,再刪除父表記錄;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 查詢數(shù)據(jù)時(shí),可能會(huì)進(jìn)行關(guān)聯(lián)查詢:
?//查詢所有姓張的學(xué)生的id,name和所在班級(jí)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%'
?? ??? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 關(guān)聯(lián)查詢類型怎么選擇:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?如果外鍵不能為空:優(yōu)先使用內(nèi)連接。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?如果外鍵可以為空:假如只需要查詢那些在另一張表中有相對(duì)應(yīng)的記錄,使用內(nèi)連接。?,假如需要查詢左側(cè)表中所有符合條件的記錄,使用左外連接.
? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ?2.3.2)在一對(duì)一中:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? tbl_person ? ? ? ? tbl_card
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? id ? ? name ? ? ? ?id ? ? name
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1001 ? zs ? ? ? ? ?1001 ? ?card1
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?特點(diǎn):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? a)共享主鍵:(不推薦)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?添加數(shù)據(jù):先添加先產(chǎn)生的表,再后產(chǎn)生的表記錄
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 刪除數(shù)據(jù):先刪除后產(chǎn)生的表記錄,再刪除先產(chǎn)生的表記錄
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?查詢數(shù)據(jù):無(wú)需進(jìn)行連接查詢:
?? ??? ??? ? ? ? ? ?
? //查詢zhangsan的駕照信息 ?1001
?? ??? ??? ??? ? ? select *
?? ??? ??? ??? ? ? from tbl_card
?? ??? ??? ??? ? ? where id='1001'
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?b)唯一外鍵:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?tbl_person ? ? ? ? ? ? tbl_card
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? id ? ? name ? ? ? ? ? ?id ? ? name ? ? person_id(唯一性約束)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1001 ? zs ? ? ? ? ? ? ?111 ? ?card1 ? ?1001
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1002 ? ls ? ? ? ? ? ? ?222 ? ?card2 ? ?1002
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1003 ? ww ? ? ? ? ? ? ?333 ? ?card3 ? ?1003
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?一對(duì)一就是一種特殊的一對(duì)多,操作跟一對(duì)多完全一樣。?
? ? ? ? ? ? ? ? ? ? ? ? ? ? 2.3.3)多對(duì)多:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 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
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?特點(diǎn):
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 添加數(shù)據(jù)時(shí),先添加父表記錄(tbl_student,tbl_course),再添加子表(tbl_student_course_relation)記錄;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 刪除數(shù)據(jù)時(shí),先刪除子表記錄(tbl_student_course_relation),再刪除父表記錄(tbl_student,tbl_course)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 查詢數(shù)據(jù)時(shí),可能會(huì)進(jìn)行關(guān)聯(lián)查詢:
? ? ? ? ? ??
?//查詢所有姓張的學(xué)生的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%'
二.主鍵和外鍵的區(qū)別總結(jié):
? ? ? ? ? ? ??
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-404778.html文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-404778.html
?
到了這里,關(guān)于SQL語(yǔ)句中的主鍵和外鍵的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!