MySql必知必會實戰練習(四)主鍵、外鍵、sql約束、聯結表

  本博將對主鍵、外鍵、MySql數據庫約束和聯結表的相關特性進行總結和實戰html

1. 主鍵

  表中的每一行都應該具備能夠惟一標識本身的一列(或一組列),而這個承擔標識做用的列稱爲主鍵數據庫

  若是沒有主鍵,數據的管理會十分混亂。好比會存在多條如出一轍的記錄,刪除和修改特定行十分困難post

(1)哪些列能夠做爲主鍵?

  任何列均可以做爲主鍵,只要它知足如下條件:性能

  a. 任何兩行都不具備相同的主鍵值,就是說這列的值都互不相同ui

  b. 每一個行都必須具備一個主鍵值,主鍵列不容許設置爲NULLurl

  c. 主鍵列的值不建議進行修改和更新spa

(2)主鍵的建立

  最簡單的表:3d

CREATE TABLE t1(
   id int not null,
   name char(20)
);

  帶主鍵的表的建立:code

CREATE TABLE t1(
   id int not null primary key,
   name char(20)
);

  帶複合主鍵的建立:htm

CREATE TABLE t1(
   id int not null,
   name char(20),
   primary key (id,name) 
);

  主鍵自增:

CREATE TABLE t1(
   id int primary key not null auto_increment,
   name char(20)
);

  建立後再決定主鍵:

CREATE TABLE t1(
   id int not null,
   name char(20)
);

alter table t1 add primary key (id);

2. 外鍵

  外鍵用來保證參照完整性,MySQL數據庫的MyIsAM存儲引擎自己並不支持外鍵,對於外鍵的定義只是起到一個註釋的做用,而InonoDB存儲引擎則完整支持外鍵約束。

  設置外鍵約束的兩個表之間會具備父子關係,通常來講,稱被引用的表爲父表,引用的表稱爲子表,字表中外鍵的字段的取值範圍由父表決定,而且數據類型必須和父表中一致。

  設置外鍵在必定程度上會下降數據庫的速度。

(1)外鍵的添加

ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_orders FOREIGN KEY (order_num) REFERENCES orders (order_num);
ALTER TABLE orderitems ADD CONSTRAINT fk_orderitems_products FOREIGN KEY (prod_id) REFERENCES products (prod_id);
ALTER TABLE orders ADD CONSTRAINT fk_orders_customers FOREIGN KEY (cust_id) REFERENCES customers (cust_id);
ALTER TABLE products ADD CONSTRAINT fk_products_vendors FOREIGN KEY (vend_id) REFERENCES vendors (vend_id);

(2)外鍵刪除

alter table products drop foreign key  fk_products_verdors;

3. MySql數據庫完整性約束

  參考以前的博客:MySql數據庫約束

4. 聯結表

(1)等值聯結

   說的直白點就是根據select語句將多個表聯結在一塊兒,但有一點須要注意的是聯結不是物理試題,它在實際的數據庫表中不存在,只存在於查詢的執行當中。

  首先看下建立聯結的例子:

  例1:select * from orders,orderitems where
     orders.order_num = orderitems.order_num;

  

  例2:select * from orders,orderitems;

  

  從上面兩個例子能明顯的看到使用where和不使用where的區別,在聯結兩個表時,你實際上作的是將第一個表中的每一行與第二個表中的每一行進行匹配,where語句做爲過濾條件,它只包含那些匹配給定條件的行,沒有where語句,第一個表中的每行將與第二個表中的每行進行配對,而無論他們的邏輯上否能夠在一塊兒,沒有聯結條件的表關係返回的結果爲笛卡兒積,檢索出的行的數目將是第一個表中的行數乘以第二個表中的行數。

  下面將用僞代碼對兩個示例進行區分:

  示例1:

for row1 in table1:
    for row2 in table 2:
         if row1.condition == row2.condition:
                print(row1+row2)

  示例2:

for row1 in table1:
    for row2 in table2:
        print(row1+row2)

(2)內部聯結

  上面展現的等值聯結,其實也稱爲內部聯結,對於這種聯結可使用稍微不一樣的語法來明確指明聯結的類型,INNER JOIN .... ON

select * from 
    orders INNER JOIN orderitems 
    ON orders.order_num = orderitems.order_num;

  ANSI SQL規範首選INNER JOIN ... ON語法,使用明確的聯結語法確保不會忘記聯結條件,有時候這樣作也能影響性能。

(3)若是隻想輸出指定聯結表的某列可使用下列方法

select orders.*,orderitems.proc_id from 
    orders INNER JOIN orderitems 
    ON orders.order_num = orderitems.order_num;

  

  這樣能夠指定列輸出

 (4)外部連接

  許多聯結將一個表中的行與另外一個表中的行相關聯。可是有時候須要包含沒有關聯的那些行,這個時候就可使用外部連接,外部聯結方式有右連接RIGHT OUTERJOIN ... ON和左聯結LEFT OUTER JOIN...ON

  看下面的三個示例進行比較就一目瞭然了

  例1:內聯結

SELECT customers.cust_id,orders.cust_id,orders.order_num
    from customers INNER JOIN orders
    ON customers.cust_id = orders.cust_id;

  例2:左外部連接

SELECT customers.cust_id,orders.cust_id,orders.order_num
    from customers LEFT OUTER JOIN orders
    ON customers.cust_id = orders.cust_id;

  輸出了10002行,至關於前面僞代碼中customers表爲外循環,只是將custonmers中沒匹配上的10002也輸出了

  例3:右外部連接

SELECT customers.cust_id,orders.cust_id,orders.order_num
    from customers RIGHT OUTER JOIN orders
    ON customers.cust_id = orders.cust_id;

  輸出了10005行,至關於前面僞代碼中orders做爲外循環,將orders中沒匹配上的10005進行了輸出

相關文章
相關標籤/搜索