版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
2(importhead)和進貨單這樣一來,我們就需要把2個表關聯(lián)起來,那么,該怎么操作呢?在MySQL中,為了把2個表關聯(lián)起來,會用到2個重要的功能:外鍵(FOREIGNKEY)和連接(JOIN)。外鍵需要在創(chuàng)建表的階段就定義;連接可以通過相同意義的字段把2假設我們有2個表,分別是表A和表B,它們通過一個公段“id”發(fā)生關聯(lián)關系,我們把這個關聯(lián)關系叫做R。如果“id”在表A中是主鍵,那么,表A就是這個關系R中的主表。相應的,表B就是這個關系中的從表,表B中的“id”,就是表B用來表AR(A)AA是從表。表B中的公段(字段A)是外鍵在MySQL中,外鍵是通過外鍵約束來定義的。外鍵約束就是約束的一種,它必須在從表中定義,包括指明哪個是外鍵字段,以及外鍵字段所的主表中的主鍵字段是什么。MySQL系統(tǒng)會根據(jù)外鍵約束的定義,對主表中數(shù)據(jù)的刪除操作。如果發(fā)現(xiàn)要刪除的主表記錄,正在被從表中某條記錄的外鍵字段所,MySQL就會提示錯誤,從而確保了關[CONSTRAINT<外鍵約束名稱>]FOREIGNKEYREFERENCES<主表名>12345678CREATETABLE(字段名類型--CONSTRAINTFOREIGNKEY(字段名)REFERENCES主表名(字段名)1ALTERTABLE從表名ADDCONSTRAINT約束名FOREIGNKEY字段名REFERENCES主表名(一般情況下,表與表的關聯(lián)都是提前設計好了的,因此,會在創(chuàng)建表的時候就把外鍵約束定義好。不過,如果需要修改表的設計(比如添加新的字段,增加新的關聯(lián)關系),但沒有預先定義外鍵約束,那么,就要用修改表的方式來補充定義。代1代123456789CREATETABLEdemo.importhead(listnumberINTPRIMARYKEY,ridINT,stocknumberINT,importtypetyDECIMAL(10,3importvalueDECIMAL(10,2),recorderINT,recordingdate然后創(chuàng)建從表demo.importdetails123456789CREATETABLEdemo.importdetailslistnumberINT,itemnumbertyimportpriceimportvalue--CONSTRAINTFOREIGNKEY(listnumber)REFERENCESimporthead運行這個SQL叫“fk_importdetails_importhead”的外鍵約束。同時,我們,這個外鍵約束的字段“l(fā)istnumber”的是表importhead里面的字段“l(fā)istnumber”。外鍵約束創(chuàng)建好之后,我們可以通過Workbench,當然,我們也可以通過SQL語句來查看,這里我們要用到MySQL自帶的、用于系統(tǒng)12-constraint_name,--3-12-constraint_name,--3-table_name,--4-column_name,--5-referenced_table_name,--6-referenced_column_name--7-8-9--constraint_name=12| | |COLUMN_NAME|13 14|fk_importdetails_importhead|importdetails|listnumber|15 161rowinset(0.05是“l(fā)istnumber2MySQL2(INNERJOIN)和外連接(OUTERMySQLJOIN、INNERJOIN、CROSSJOIN連接。我們可以通過JOIN把兩個表關聯(lián)起來,來查詢兩個表中的數(shù)據(jù)。咱們的項目中有會員銷售的需求,所以,我們的流水表中的數(shù)據(jù)記錄,既包括非會員的普通銷售,又包括會員銷售。它們的區(qū)別是,會員銷售的數(shù)據(jù)記錄包括會員編號,而在非會員銷售的數(shù)據(jù)記錄中,會員編號為空。表進行了簡化,并且假設業(yè)務字段cardno是會員信息表的主鍵。簡化以后的結構如下所demo.trans“cardno”是這個關聯(lián)關系中的外1mysql>2-3-4-5-66789--->---demo.transASademo.membermasterASbON(a.cardno= |transactionno|itemnumber ty|price| | 1 +1++++1.000|89.00|2020-12-0100:00:00|+++1rowinset(0.00可以看到,我們通過公段“cardno”把兩個表關聯(lián)到了一起,查詢出了會員消費的數(shù)在這里,關鍵字JOIN與關鍵字ON配對使用,意思是查詢滿足關聯(lián)條件“demo.transcardnodemo.membermastercardnoLEFTJOIN,返回左邊表中的所有記錄,以及右表中符合連接條件RIGHTJOIN,返回右邊表中的所有記錄,以及左表中符合連接條123456789FROMdemo.transASLEFTJOINdemo.membermasterASb--LEFTJOIN,以demo.transaction為主ON(a.cardno=b.cardno);+++++transactionno|itemnumber ty|price| |+12+rowsinset(0.00+12++++1.000|89.00|2020-12-0100:00:001.000|12.00|2020-12-0200:00:00|+++可以看到,我用到了LEFTJOIN,意思是以表demo.trans中的數(shù)據(jù)記錄為主,這個表中的數(shù)據(jù)記錄要全部出現(xiàn)在結果集中,同時給出符合連接條件(a.cardno=b.cardno)的表demo.membermaster中的字段membername的值。12345123456789demo.membermasterASbRIGHTJOINdemo.transASaON(a.cardno=b.cardno);--RIGHTJOIN,順序顛倒了,還是以12-3-4-5-6-7-8-9-demo.transAS-LEFT ---demo.membermasterASb(a.cardno=1213141516171820mysql>--------demo.membermasterAS-RIGHT ---demo.transAS-ON(a.cardno=2其實,在MySQL中,外鍵約束不是關聯(lián)查詢的必要條件。很多人往往在設計表的時候,覺得只要連接查詢就可以搞定一切了,外鍵約束太麻煩,沒有必要。如果你這么想,就進入了一個誤區(qū)。11。我們進貨的商品編號是1234,進貨數(shù)量是1,進貨價格是10,進貨金額是10。INSERTINTO()(1代代12345678mysql>SELECT->FROM+++++|listnumberrid|stocknumber|importtype+|+1234++1++1++1++ty|+NULL+1rowinset(0.00INSERTINTO()(代代12345678mysql>SELECT->FROM++++++|listnumber|itemnumberty|importprice|importvalue+|+1234++1++1.000++10.00++10.00+1rowinset(0.00這樣,我們就有了123411進貨價格是1010DELETEFROMWHERElistnumbere=運行這條語句,MySQL會提示錯誤,因為數(shù)據(jù)刪除了外鍵約束??吹搅藛??MySQL不知道你有沒有注意我插入數(shù)據(jù)的順序:為什么我要先插入進貨單頭表的數(shù)據(jù),再插入進貨單明細表的數(shù)據(jù)呢?其實,這是因為,如果我先插入數(shù)據(jù)到從表,也就是進貨單明細表,會導致MySL找不到參照的主表信息,會提示錯誤,因為添加數(shù)據(jù)了外鍵約束。要是你這么想,可能就會“中招”了。原因很簡單,既然我們把進貨數(shù)據(jù)拆成了2個表,這就決定了無論是數(shù)據(jù)添加,還是數(shù)據(jù)刪除,都不能通過一條SQL語句實現(xiàn)。實際工作中,什么突況都是有可能發(fā)生的。你認為一定會完成的操作,完全有可能只執(zhí)行了一我們曾經(jīng)就遇到過這么一個問題:用戶月底盤點的時候,盤點單無法生成,系統(tǒng)提示“有未處理的進貨單”。經(jīng)過排查,發(fā)現(xiàn)是進貨單數(shù)據(jù)發(fā)生了數(shù)據(jù)缺失,明細數(shù)據(jù)還在,對應的單頭數(shù)據(jù)卻被刪除了。我們反復排查之后,才發(fā)現(xiàn)是缺少了防止數(shù)據(jù)缺失的機制。最后通過定義外鍵約束,解決了這個問題。所以,雖然你不用外鍵約束,也可以進行關聯(lián)查詢,但是有了它,MySQL現(xiàn)在來回答另外一個問題,為什么在MySQL里,沒有外鍵約束也可以進行關聯(lián)查詢呢?原因是外鍵約束是有成本的,需要消耗系統(tǒng)資源。對于大并發(fā)的SL操作,有可能會不適合。比如大型的數(shù)據(jù)庫,可能會因為外鍵約束的系統(tǒng)開銷而變得非常慢。所以,MySL允許你不使用系統(tǒng)自帶的外鍵約束,在應用層面完成檢查數(shù)據(jù)一致性的邏輯。也就是說,即使你不用外鍵約束,也要想辦法通過應用層面的附加邏輯,來實現(xiàn)外鍵約束的功能,確保數(shù)據(jù)的一致性。外鍵約束,可以幫助我們確定從表中的外鍵字段與主表中的主鍵字段之間的關系,還可以確保從表中數(shù)據(jù)所的主表數(shù)據(jù)不會被刪除,從而保證了2個表中數(shù)據(jù)的一致性連接可以幫助我們對2個相關的表進行連接查詢,從2個表中獲取需要的信息。左連接表示連接以左邊的表為主,結果集中要包括左邊表中的所有記錄;右連接表示連接以右邊的表為主,結果集中要包括右邊表中的所有記錄。我匯總了常用的SQL代碼代碼1--223456789CREATETABLE(CONSTRAINTFOREIGNKEY(字段名)REFERENCES主表名(字段名稱ALTERTABLE從表名ADDCONSTRAINT約束名FOREIGNKEY字段名REFERENCES主表名(--連接查詢SELECT字段名FROM表名ASaJOIN表名ASON(a.字段名稱=b.字段名稱SELECTFROM表名ASaLEFTJOIN表名ASbON(a.字段名稱=b.字段名稱SELECTFROM表名ASaRIGHTJOIN表名ASbON(a字段名稱=b字段名稱剛開始學習MySQL的同學
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026上半年云南事業(yè)單位聯(lián)考開放大學招聘管理人員1人考試參考試題及答案解析
- 2026“才聚齊魯成就未來”山東鋼鐵股份有限公司博士后科研工作站博士后招聘參考考試題庫及答案解析
- 2026浙江杭州市中醫(yī)院招聘高層次人才19人·考試參考題庫及答案解析
- 2026年老年患者營養(yǎng)支持護理與監(jiān)測要點
- 2026年呼吸內(nèi)科患者氧療護理規(guī)范實訓課程
- 化妝造型實體培訓課件
- 2026年兒科支氣管哮喘護理管理與健康教育
- 2026年傷口造口護理新技術應用與案例解析
- 2026年護理文書法律風險識別與規(guī)避策略
- 2026年綠色供應鏈碳排放協(xié)議
- 2025-2026年人教版二年級上冊語文期末考試卷及答案
- 檔案管理操作規(guī)程及實施細則
- 寒假班安全協(xié)議書
- (新教材)2026年人教版八年級下冊數(shù)學 21.1 四邊形及多邊形 課件
- 精神科醫(yī)生精神科醫(yī)療質量控制方案
- 2026年高考語文專題復習:文學類文本散文閱讀 講義(含練習題及答案)
- 2025廣東省南粵交通投資建設有限公司招聘筆試歷年參考題庫附帶答案詳解
- 2025年人工智能在電力調度中的應用項目可行性研究報告及總結分析
- DB1310T 370-2025 化學分析實驗室玻璃儀器清洗規(guī)范
- GB/T 46738-2025家用和類似用途電器的安全使用年限房間空氣調節(jié)器的特殊要求
- 2025福建水投集團招聘7人筆試歷年參考題庫附帶答案詳解
評論
0/150
提交評論