mysql中外來鍵約束級聯更新與刪除
預設情況下,mysql的外來鍵約束型別是restrict (no action)型別 ,表示一般的外來鍵約束。
ON DELETE CASCADE ON UPDATE CASCADE 可以設定外來鍵為級聯更新、級聯刪除。
當主表的關聯欄位發生變更時,從表自動做相應的改變。
級聯刪除:當主表的關聯記錄被刪除時,從表會自動刪除與主表刪除記錄相關聯的記錄。
級聯更新: 當主表的記錄(一般是主鍵值)發生更新時,從表自動更新自己的外來鍵值。
示例:
建立t_user表
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
建立 t_address
一個使用者能有多個收貨地址,所以使用者到地址是一對多的關係,並設定級聯更新與級聯刪除。
CREATE TABLE `t_address` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`province` varchar(32) DEFAULT NULL,
`city` varchar(32) DEFAULT NULL,
`detialAddress` varchar(200) DEFAULT NULL,
`user_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
CONSTRAINT `t_address_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
插入一些測試資料
INSERT INTO t_user (NAME) VALUES
('張三'),('李四'),('王五');
INSERT INTO t_address(province,city,detialAddress,user_id) VALUES
('湖北','武漢','雄楚大道101號',1),
('湖北','武漢','關山大道110號',1),
('湖北','武漢','珞喻路92號',1),
('湖南','長沙','aaa路aaa號',2),
('湖南','長沙','aaa路bbb號',2),
('湖南','長沙','aaa路ccc號',2) ;
這時發現使用者表中3條記錄,地址表中6表條記錄。張三有3個收貨地址,李四也是,王五沒有收貨地址。
這時,更新使用者表中id為1的記錄,更新id值為10 ,這時發現地址表中前3條記錄的外來鍵(user_id)值都從1更新為了10
UPDATE t_user a SET a.`id` =10 WHERE a.`id`=1; #執行這個sql語句時不會報外來鍵約束的錯,因為從表外來鍵列上設定了級聯更新。
如果主表執行刪除 ,則會自動刪除從表中的相應記錄。
DELETE FROM t_user WHERE t_user.`id`=1 ; #執行時不會報錯,因為從表外來鍵上設定了級聯刪除。
這時從t_address表中的,前3條記錄就被級聯刪除了。
注意:
如果主從表只是普通的外來鍵約束,則在更新/刪除主表記錄時,需要先更新/刪除從表記錄,否則將會報外來鍵約束異常,導致操作失敗。
。。。。。。
相關文章
- mysql 刪除老是報外來鍵約束MySql
- 批量刪除MSSQL 中主外來鍵約束SQL
- Mysql-基本練習(06-唯一約束、外來鍵約束、新增、刪除單列)MySql
- 在MySQL中利用外來鍵實現級聯刪除(轉)MySql
- 資料完整性約束:主鍵、外來鍵、各種約束的建立刪除語句
- 解決資料庫的索引亂碼問題,先刪除外來鍵約束,再刪除主鍵約束及其索引資料庫索引
- 解決無法刪除表,提示被外來鍵約束引用
- 生成指令碼,得到所有表的外來鍵約束,然後刪除並重建這些約束指令碼
- 教你mysql如何增加外來鍵約束MySql
- MySQL禁用恢復外來鍵約束MySql
- 【PK】Oracle 10g刪除主鍵約束後無法刪除唯一約束索引問題的模擬與分析Oracle 10g索引
- Javaweb-約束-外來鍵約束JavaWeb
- 新增/刪除約束(Oracle)Oracle
- 【Foreign Key】Oracle外來鍵約束三種刪除行為Oracle
- 利用虛擬列實現虛擬刪除的主外來鍵約束
- Oracle定義約束 外來鍵約束Oracle
- mysql不能新增外來鍵約束怎麼辦MySql
- mysql啟動和關閉外來鍵約束MySql
- 級聯刪除
- Sqlserver中所有約束的型別,建立、修改與刪除SQLServer型別
- 【MySQL】MySQL進階(外來鍵約束、多表查詢、檢視、備份與恢復)MySql
- mysql 關聯更新刪除不走索引優化MySql索引優化
- mysql資料庫匯入外來鍵約束問題MySql資料庫
- mysql~資料完整性考慮~外來鍵約束MySql
- SQL的主鍵和外來鍵約束SQL
- 刪除或清空具有外來鍵約束的表資料包-ERROR 1701 (42000)Error
- oracle外來鍵約束的總結Oracle
- oracle主外來鍵鎖_lock_約束Oracle
- MySQL 多表關聯刪除MySql
- MySQL 約束MySql
- MySQL·捉蟲動態·DROPDATABASE外來鍵約束的GTIDBUGMySqlDatabaseTiDB
- mysql刪除主鍵索引,刪除索引語法MySql索引
- oracle鍵約束控制Oracle
- 主外來鍵關聯刪除(on delete set null和on delete cascade)deleteNull
- 如何解決邏輯刪除與資料庫唯一約束衝突資料庫
- oracle級聯刪除使用者,刪除表空間Oracle
- AppBoxFuture(七): 分散式外來鍵約束APP分散式
- SQL外來鍵約束的含義及建立SQL