mysql 外鍵約束及表關聯


一、MYSQL中的約束

  1、主鍵:primary key 唯一非空的特性並且可以優化查詢速度

  2、外鍵:foreign key 外鍵的作用保證2個或2個以上的數據表的數據一致性和完整性

  3、唯一:unique

  4、非空:not null

  5、默認值:deafult 

  6、自增:auto_increment 設置了自增值每次自動增加1

 

二、外鍵的添加方式

  1、方式一

    create table 表名 (

      字段名1 數據類型  約束,

      字段名2 數據類型 約束,

      。。。

      constraint  外鍵名  foreign key(字段名)  references   主表名(字段名)  級聯操作);

   方式2:表創建完成后添加外鍵

   alter table 表名 add constraint  外鍵名  foreign key (字段1) references  表名2(字段名2)級聯操作;

三、外鍵的注意事項

  

1、  兩個表xiaodi和dage,如果xiaodi表中設置了外鍵關聯了dage,那么我們把xiaodi表稱為從表,dage表稱為主表

2、  在建表的時候要現有主表,后有從表

3、  如果要刪除數據表,那么需要先刪從表,在刪主表

4、  如果要向從表中插入數據,那么插入的數據必須是主表中存在的值,如果該值不存在,那么插入操作執行失敗

5、  不可以對主表中的和從表有關聯的數據直接進行刪除,只有把從表的相關的數據先刪除后再刪除主表中的數據(即先刪從表,再刪主表)

6、  一個表中可以有多個外鍵,但是主鍵只能有一個

7、  外鍵通常關聯的是主表的主鍵或者設置了unique的字段

8、  如果要使用外鍵,那么存儲引擎不可以是myisam

9、  外鍵和外鍵關聯的字段的數據類型要一致

一、查看外鍵:show  create  table  表名;

二、刪除外鍵:alter  table  表名  drop   foreign  key   外鍵名;

三、外鍵的級聯操作

1、  on   delete   cascade:表示主表中的數據被刪除后,從表中相關數據也會被刪除

2、  on   update   cascade:表示主表中的數九被修改后,從表中的相關數據也會被修改

3、  on  delete  cascase  on  update  cascase:表示刪除和修改都有級聯操作

4、  on  delete  set  null:表示主表中的數據被刪除后,從表中相關數據會被設置為null

5、  on   update  set null

6、  示例:

 

 ---------------------------------------------------------------------------------------------------------------------------------------------------------

一、什么是連接查詢:就是將二個或二個以上的表,“連接起來”當做一個數據源,並從中去取得所須要的數據。連接查詢包括交叉連接查詢、內連接查詢、外連接查詢

(一)  交叉連接:交叉連接不帶WHERE子句,它返回被連接的兩個表所有數據行的笛卡爾積,返回結果集合中的數據行數等於第一個表中符合查詢條件的數據行數乘以第二個表中符合查詢條件的數據行數。

1、  格式1:select  要查詢的內容   from  表名1  cross  join  表名2;

2、  格式2:select  要查詢的內容   from  表名1,表名2…;

3、  格式3:select  要查詢的內容   from  表名1  join 表名2;

(二)  內連接:內連接也叫連接,是最早的一種連接。還可以被稱為普通連接或者自然連接,內連接是從結果表中刪除與其他被連接表中沒有匹配行的所有行,所以內連接可能會丟失信息。

1、  方法1:select  要查詢的內容   from  表名1  inner  join  表名2  on  表1.字段名=表2.字段名;

2、  方法2:select  要查詢的內容   from  表名1  join  表名2  on  表1.字段名=表2.字段名;

3、  注意:在使用內連接時,可以給表起別名,格式為select  要查詢的內容   from  表名1  別名1  join  表名2  別名2  on  別名1.字段名=別名2.字段名;

(三)  外鏈接:只限制一張表中的數據必須滿足連接條件,而另一張表中的數據可以不滿足連接條件的連接方式,外連接分為左外連接、右外連接

1、  左外連接(以左表為主,即左表中的內容會全部顯示出來,右表中不符合條件的部分用null補充):select  要查詢的內容  from  表1  left  join  表2  on 表1.字段名=表2.字段名;

2、  右外連接(以右表為主,即右表中的內容會全部顯示出來,左表中不符合條件的部分用null補充)):select  要查詢的內容  from  表1  right  join  表2  on 表1.字段名=表2.字段名;

3、  習題:以product表和product_type表為例,查出每個品種各有多少個商品select a.protype_name, count(b.pro_name) from product_type a left join product b on a.protype_id = b.protype_id group by a.protype_name;

二、子查詢:當一個查詢是另一個查詢的條件時,稱之為子查詢。子查詢可以分為如下幾類

(一)  按子查詢結果分:表子查詢、行子查詢、列子查詢、標量子查詢

1、  表子查詢:子查詢的結果為多行多列,即一個表,該子查詢通常放在from關鍵字后面

2、  行子查詢:返回一行數據中多個列的內容

3、  列子查詢:返回的結果為一列多行數據,此時可以當做“多個值”使用,類似:(5,17,8)

4、  標量子查詢:返回的結果為一行一列,即一個值

(二)  按子查詢所在位置分

1、  作為主查詢的結果數據:select c1,(select  f1  from  tab2)  as  f11  from  tab1;這里子查詢應該是一個標量子查詢

2、  作為主查詢的條件數據:select  c1  from  tab1  where  c1  in  (select  f1  from  tab2);這里子查詢應該是列子查詢,即一列多行

3、  作為主查詢的數據來源:select  c1  from  (select  f1  as  c1, f2  from  tab2)  as  t2;這里子查詢應該是表子查詢

(三)  子查詢之any、all關鍵字的使用

1、  any:表示大於集合中的任意一個值即可

1)     表1

 

2)     表2

 

3)     查詢1:mysql> select * from tab2 where id>any (select f1 from tab3);

4)     查詢2:mysql> select * from tab2 where id>all (select f1 from tab3);

(四)  子查詢之exists關鍵字


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM