top
Loading...
3.6.6.使用外鍵
3.6.6. 使用外鍵

MySQL中,InnoDB表支持對外部關鍵字約束條件的檢查。參見15.2節,“InnoDB存儲引擎”。還可以參見 1.8.5.5節,“外鍵”。

只是聯接兩個表時,不需要外部關鍵字。對于除InnoDB類型的表,當使用REFERENCES tbl_name(col_name)子句定義列時可以使用外部關鍵字,該子句沒有實際的效果,只作為備忘錄或注釋來提醒,你目前正定義的列指向另一個表中的一個列。執行該語句時,實現下面很重要:

·         MySQL不執行表tbl_name 中的動作,例如作為你正定義的表中的行的動作的響應而刪除行;換句話說,該句法不會致使ON DELETEON UPDATE行為(如果你在REFERENCES子句中寫入ON DELETEON UPDATE子句,將被忽略)。

·         該句法可以創建一個column;但不創建任何索引或關鍵字。

·         如果用該句法定義InnoDB表,將會導致錯誤。

你可以使用作為聯接列創建的列,如下所示:

CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    name CHAR(60) NOT NULL,
    PRIMARY KEY (id)
);
 
CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    style ENUM('t-shirt', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id),
    PRIMARY KEY (id)
);
 
INSERT INTO person VALUES (NULL, 'Antonio Paz');
 
SELECT @last := LAST_INSERT_ID();
 
INSERT INTO shirt VALUES
(NULL, 'polo', 'blue', @last),
(NULL, 'dress', 'white', @last),
(NULL, 't-shirt', 'blue', @last);
 
INSERT INTO person VALUES (NULL, 'Lilliana Angelovska');
 
SELECT @last := LAST_INSERT_ID();
 
INSERT INTO shirt VALUES
(NULL, 'dress', 'orange', @last),
(NULL, 'polo', 'red', @last),
(NULL, 'dress', 'blue', @last),
(NULL, 't-shirt', 'white', @last);
 
SELECT * FROM person;
+----+---------------------+
| id | name                |
+----+---------------------+
|  1 | Antonio Paz         |
|  2 | Lilliana Angelovska |
+----+---------------------+
 
SELECT * FROM shirt;
+----+---------+--------+-------+
| id | style   | color  | owner |
+----+---------+--------+-------+
|  1 | polo    | blue   |     1 |
|  2 | dress   | white  |     1 |
|  3 | t-shirt | blue   |     1 |
|  4 | dress   | orange |     2 |
|  5 | polo    | red    |     2 |
|  6 | dress   | blue   |     2 |
|  7 | t-shirt | white  |     2 |
+----+---------+--------+-------+
 
 
SELECT s.* FROM person p, shirt s
 WHERE p.name LIKE 'Lilliana%'
   AND s.owner = p.id
   AND s.color <> 'white';
 
+----+-------+--------+-------+
| id | style | color  | owner |
+----+-------+--------+-------+
|  4 | dress | orange |     2 |
|  5 | polo  | red    |     2 |
|  6 | dress | blue   |     2 |
+----+-------+--------+-------+

按照這種方式使用,REFERENCES子句不會顯示在SHOW CREATE TABLEDESCRIBE的輸出中:

SHOW CREATE TABLE shirtG
*************************** 1. row ***************************
Table: shirt
Create Table: CREATE TABLE `shirt` (
`id` smallint(5) unsigned NOT NULL auto_increment,
`style` enum('t-shirt','polo','dress') NOT NULL,
`color` enum('red','blue','orange','white','black') NOT NULL,
`owner` smallint(5) unsigned NOT NULL,
PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1

在列定義中,按這種方式使用REFERENCES作為注釋或“提示”適用于表MyISAMBerkeleyDB

作者:mysql.com
來源:http://dev.mysql.com/doc/refman/5.1/zh/tutorial.html
北斗有巢氏 有巢氏北斗