99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)精彩閱讀sql語(yǔ)句中的主外鍵關(guān)系
sql語(yǔ)句中的主外鍵關(guān)系
2018-03-13
收藏
sql語(yǔ)句中的主外鍵關(guān)系

主鍵Primary key,唯一標(biāo)示一個(gè)實(shí)體。是保證數(shù)據(jù)庫(kù)的實(shí)體完整性,保證數(shù)據(jù)中數(shù)據(jù)的正確性和合理性,取值非空唯一。

外鍵Foreign,是用來(lái)使表與表之間聯(lián)系。用來(lái)保證數(shù)據(jù)庫(kù)的參照完整性,外鍵的取值必須來(lái)自參照表參照列的值,可以為空也可不為空。

外鍵的作用:

保持?jǐn)?shù)據(jù)一致性,完整性,主要目的是控制存儲(chǔ)在外鍵表中的數(shù)據(jù)。 使兩張表形成關(guān)聯(lián),外鍵只能引用外表中的列的值!

主外鍵的關(guān)系結(jié)構(gòu):

1,一對(duì)一,不用引用主外鍵,把它們放一個(gè)表中即可

例如:一個(gè)學(xué)生只能有一個(gè)卡號(hào),那么學(xué)生跟卡號(hào)放在一個(gè)表中即可

2,一對(duì)多,引用主外鍵,‘一’相當(dāng)于主鍵,‘多’即是引用主鍵的外鍵。

例如:一個(gè)班級(jí)可以有多個(gè)學(xué)生,并且一個(gè)學(xué)生只能屬于一個(gè)班級(jí),這就是一對(duì)多的關(guān)系;

3,多對(duì)多關(guān)系,需要?jiǎng)?chuàng)建一個(gè)表,表中需要兩個(gè)字段,分別是引用,兩個(gè)多對(duì)多字段主鍵的外鍵。

例如:
學(xué)生表(學(xué)號(hào),姓名,…………)主鍵:學(xué)號(hào)
課程表(課程號(hào),課程名,…………)主鍵:課程號(hào)
一個(gè)學(xué)生能選多門(mén)課,一個(gè)課可以由多個(gè)學(xué)生選,即是多對(duì)多關(guān)系,
那么成績(jī)表就是它們之間關(guān)系的體,
即引用成績(jī)表(學(xué)號(hào),課程號(hào),成績(jī))。這里學(xué)號(hào)和課程號(hào),分別是學(xué)生表和課程表中學(xué)號(hào)和課程號(hào)的外鍵

在我們現(xiàn)在這個(gè)階段中,主要還是使用,主外鍵間的一對(duì)多的關(guān)系

下面一起來(lái)簡(jiǎn)單看一下大概建成的表結(jié)構(gòu)

<span style="font-family:KaiTi_GB2312;font-size:24px;">--建班級(jí)表  
      
    create table class(  
      
    classid int primary key,--定義班級(jí)ID為主鍵  
      
    classname varchar(15)  
      
    )  
    </span>  


[sql] view plaincopy

    <span style="font-family:KaiTi_GB2312;font-size:24px;">--建學(xué)生表  
      
    create table students(  
      
    studentid int primary key,--定義學(xué)生ID為主鍵  
      
    classid int ,--外鍵值,跟班級(jí)表classid 屬性類(lèi)型相同  
      
    stuname varchar(20),--學(xué)生姓名  
    </span>  


[sql] view plaincopy

    <span style="font-family:KaiTi_GB2312;font-size:24px;">---定義外鍵  
      
    foreign key(classid) references class(classid) --本表classid是基于class表classid的外鍵  
      
    )  
    </span>  
如上定義了主外鍵后,兩個(gè)表間的關(guān)系就是一對(duì)多的關(guān)系了,并且學(xué)生表內(nèi)的classid必須依托班級(jí)表的classid存在,也就是說(shuō)外鍵必須要主鍵存在的時(shí)候才能創(chuàng)建,

例如:

--在班級(jí)表為空的情況往學(xué)生表插入一條記錄是不允許的:

<span style="font-family:KaiTi_GB2312;font-size:24px;">insert intostudents(studentid,classid,stuname)values(1,1,'小明')</span>
系統(tǒng)會(huì)拋出異常提示主鍵表班級(jí)表內(nèi)班級(jí)ID不存在這樣是不允許插入的;

必須要先往班級(jí)表內(nèi)插入一條記錄:

<span style="font-family:KaiTi_GB2312;font-size:24px;">insert into class(classid,classname)values(1,'一班')</span>
后才能執(zhí)行插入前面一條往學(xué)生表插入信息的語(yǔ)句..

解釋?zhuān)?

對(duì)于機(jī)房收費(fèi)系統(tǒng)來(lái)說(shuō),如圖:

只有當(dāng)學(xué)生注冊(cè)了信息,有了卡號(hào),在學(xué)生信息表中存在了,才可以進(jìn)行充值,退卡,上下機(jī)等,主外鍵的作用也就是當(dāng)沒(méi)有學(xué)生信息時(shí),我們不可以進(jìn)行充值等操作,而且想要?jiǎng)h除學(xué)生信息表中的數(shù)據(jù),必須先將充值表,退卡表,上下機(jī)表中此卡號(hào)的人刪除之后才可以刪除學(xué)生信息表中的數(shù)據(jù),這樣就避免了當(dāng)學(xué)生未注冊(cè)時(shí),就可以充值的情況

也就是說(shuō),如果主鍵表中數(shù)據(jù)的更改使之與外鍵表中數(shù)據(jù)的鏈接失效,則這種更改是不能實(shí)現(xiàn)的,從而確保了引用完整性。如果試圖刪除主鍵表中的行或更改主鍵值,而該主鍵值與另一個(gè)表的 FOREIGN KEY 約束值相關(guān),則該操作不可實(shí)現(xiàn)。若要成功更改或刪除 FOREIGN KEY 約束的行,可以先在外鍵表中刪除外鍵數(shù)據(jù)或更改外鍵數(shù)據(jù),然后將外鍵鏈接到不同的主鍵數(shù)據(jù)上去。

外鍵是用來(lái)控制數(shù)據(jù)庫(kù)中數(shù)據(jù)的數(shù)據(jù)完整性的 。就是當(dāng)你對(duì)一個(gè)表的數(shù)據(jù)進(jìn)行操作和他有關(guān)聯(lián)的一個(gè)或更多表的數(shù)據(jù)能夠同時(shí)發(fā)生改變,這就是外鍵的作用

連接查詢(xún)與內(nèi)外鍵的關(guān)系:

連接的 連接條件:A表的主鍵 = B表的外鍵如果做連接的兩表沒(méi)有主外鍵關(guān)系,那么連接結(jié)果沒(méi)有意義。

例:學(xué)生表和選課表做連接,select *from 學(xué)生表,選課表where 學(xué)生表.學(xué)號(hào)(主鍵)=選課表.學(xué)號(hào)(外鍵)

主外鍵可以建級(jí)聯(lián)級(jí)觸發(fā)器,用來(lái)做級(jí)聯(lián)刪除、更新。作用原理還是因?yàn)橹魍怄I將兩表聯(lián)系。

數(shù)據(jù)分析咨詢(xún)請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢(xún)
客服在線
立即咨詢(xún)
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶(hù)后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }