天天看點

第三章 第一節:外鍵限制——FOREIGN

外鍵限制的要求

1.兩個表必須是InnoDB表,MyISAM表暫時不支援外鍵(據說以後的版本有可能支援,但至少目前不支援);

2.外鍵列必須建立了索引,MySQL 4.1.2以後的版本在建立外鍵時會自動建立索引,但如果在較早的版本則需要顯示建立; 

3.外鍵關系的兩個表的列必須是資料類型相似,也就是可以互相轉換類型的列,比如int和tinyint可以,而int和char則不可以;

外鍵的好處:可以使得兩張表關聯,保證資料的一緻性和實作一些級聯操作;

 外鍵限制的參照操作

ON DELETE、ON UPDATE表示事件觸發限制,可設參數:

RESTRICT(限制外表中的外鍵改動)

CASCADE(跟随外鍵改動)c

SET NULL(設空值)

SET DEFAULT(設預設值)

NO ACTION(無動作,預設的)

舉例:

@設定一個省份provinces,一個使用者users。

provinces 主鍵id SMALLINT 無符号,pname 非空

users 外鍵pid SMALLINT 無符号,參考provinces的id,删除操作,id,username。。。

mysql> CREATE TABLE provinces(

    -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

    -> pname VARCHAR(20) NOT NULL

    -> );

mysql> CREATE TABLE users(

    -> id SMALLINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,

    -> username VARCHAR(20) NOT NULL,

    -> pid SMALLINT UNSIGNED,

    -> FOREIGN KEY (pid) REFERENCES provinces (id) ON DELETE CASCADE//這句就是删除附表中的資料,子表自動删除,相應的的資料。

    -> );

@向兩個表中添加資料(一定要先向父表中添加)

mysql> INSERT provinces (pname) VALUES ('A');

mysql> INSERT provinces (pname) VALUES ('B');

mysql> INSERT provinces (pname) VALUES ('C');

mysql> SELECT * FROM provinces;

+----+-------+

| id | pname |

+----+-------+

|  1 | A     |

|  2 | B     |

|  3 | C     |

+----+-------+

mysql> INSERT users(username,pid) VALUES ('Tom',3);

mysql> INSERT users(username,pid) VALUES ('John',1);

mysql> INSERT users(username,pid) VALUES ('Rose',3);

mysql> SELECT * FROM users;

+----+----------+------+

| id | username | pid  |

+----+----------+------+

|  1 | Tom      |    3 |

|  2 | John     |    1 |

|  3 | Rose     |    3 |

+----+----------+------+

@删除provinces中主鍵id為3的資料

mysql> DELETE FROM provinces WHERE id=3;

@顯示兩個表的資訊:

mysql> SELECT * FROM provinces;

+----+-------+

| id | pname |

+----+-------+

|  1 | A     |

|  2 | B     |

+----+-------+

mysql> SELECT * FROM users1;

+----+----------+------+

| id | username | pid  |

+----+----------+------+

|  2 | John     |    1 |

+----+----------+------+

ON UPDATE 等操作原理一緻。

繼續閱讀