MySql外來鍵關聯Foreign key及error 1452
文章出處:http://xuehu2009.iteye.com/blog/571138
今天往MySQL的一張表裡插記錄時,出現一個錯誤提示:
ERROR 1452 : Cannot add or update a child row: a foreign key constraint fails。。。。
仔細觀察後才發現該表中有一欄位是外來鍵,它參照了另外一張表的主鍵。
出現錯誤的原因是:插入外來鍵的資料在另一張表的主鍵中不存在。
解決方法當然,很簡單了,插入另一張表中主鍵存在的資料唄。。。。。
下面我們來一起探討一下MySQL的外來鍵吧。。。
一、參照完整性
1。參照完整性規則:
上面這就是參照完整性的定義,說明了一個表中的外來鍵的取值只有兩種可能,要麼為空,要麼只能是它參照的表的主鍵的值。
因為現實世界中的實體之間往往存在某種聯絡,在關係模型中實體及實體間的聯絡都是用關係來描述的。這樣就自然存在著關係與關係間的引用啊。當資料庫中的一個表與一個或多個表進行關聯時都會涉及到參照完整性,這樣可以保證資料的一致性和實現一些級聯操作。
二、建立MySQL外來鍵關係的前提條件
為了建立兩個MySQL表之間的一個外來鍵關係,必須滿足以下三種情況:
- * 兩個表必須是InnoDB表型別。
- * 使用在外來鍵關係的域必須為索引型(Index)。
- * 使用在外來鍵關係的域必須與資料型別相似。
三、外來鍵的定義:
外來鍵的定義語法:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
該語法可以在 CREATE TABLE 和 ALTER TABLE 時使用,如果不指定CONSTRAINT symbol,MYSQL會自動生成一個名字。
ON DELETE、ON UPDATE表示事件觸發限制,可設引數:
RESTRICT(限制外表中的外來鍵改動)
CASCADE(跟隨外來鍵改動)
SET NULL(設空值)
SET DEFAULT(設預設值)
NO ACTION(無動作,預設的)
舉例:建表
新建一個parts的表,cpu欄位用來存放所有的cpu配件型號,再新建一個pc的表,其中的cpumodel欄位用來存放pc機中的cpu型號,顯然,cpumodel欄位中的所有記錄應該存在於parts表中。
mysql> create table parts(
-> cpu varchar(20) not null primary key,
-> index(cpu)
-> )engine=innodb;
Query OK, 0 rows affected (0.01 sec)
mysql> create table pc(
-> cpumodel varchar(20) not null,
-> index(cpumodel),
-> constraint fk_pc foreign key(cpumodel) references parts(cpu)
-> )engine=innodb;
Query OK, 0 rows affected (0.01 sec)
注意:對於非InnoDB表, FOREIGN KEY 語句將被忽略。對parts表新增資料1,2,3,接著對pc表進行測試,滿足條件的 1 可以順利insert進去,而不符合條件的字元 5 在insert表的時候,出現外來鍵約束性錯誤,這正是我們想要的結果
mysql> insert into parts values('1'),('2'),('3');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> insert into pc values('1');
Query OK, 1 row affected (0.01 sec)
mysql> insert into pc values('5');
ERROR 1452 (23000): Cannot add or update a child row: a foreign
key constraint fails (`Orange/pc`, CONSTRAINT `pc_ibfk_1` FOREIGN KEY
(`cpumodel`) REFERENCES `parts` (`cpu`))
四、外來鍵的刪除
這個fk_pc就是表pc的外來鍵,用來為刪除外來鍵定義用的,如下所示:
mysql> ALTER TABLE pc DROP FOREIGN KEY fk_pc;
Query OK, 1 row affected (0.25 sec)
Records: 1 Duplicates: 0 Warnings: 0
這樣pc.cpumodel外來鍵定義就被刪除了,但是如果定義時沒有指定CONSTRAINT fk_pc (即外來鍵符號)時該怎麼刪除呢?別急,沒有指定時,MySQL會自己建立一個,可以通過以下命令檢視:
mysql> show create table pc;
CREATE TABLE `pc` (
`cpumodel` varchar(20) NOT NULL,
KEY `cpumodel` (`cpumodel`),
CONSTRAINT `pc_ibfk_1` FOREIGN KEY (`cpumodel`) REFERENCES `parts` (`cpu`) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=latin1
就可以看到外來鍵別名pc_ibfk_1 然後,就可以執行以下命令刪除外來鍵定義:
mysql> ALTER TABLE pc DROP FOREIGN KEY pc_ibfk_1;
Query OK, 1 row affected (0.66 sec)
Records: 1 Duplicates: 0 Warnings: 0