1.外來鍵
建表時新增外來鍵:constraint 外鍵名 foreign key 從表字段 references 主表字段 級聯操作
create table dage( create table xiaodi(
dage_idint primary key, xiaodi_id int,
namechar(10) name char(10),
); dage_idint,
constraint fk foreign key(dage_id) references dage(dage_id));
建表後新增外來鍵:alter table 表名 add constraint 外鍵名 foreign key(欄位1) references 表名2(欄位名) 級聯操作
檢視:①desc 表名; ②show create table 表名
刪除:alter table 表名 drop foreign key 外鍵名
注意:設定了外來鍵的表是從表,它關聯的表被稱為主表;給從表插入資料時,插入資料必須是主表的被關聯字段出現的資料;先建主表再建從表;先刪從表再刪主表。
2.級聯操作
on delete cascade:主表中的資料被刪,從表中相關資料也會被刪
on update cascade:主表中的資料被改後,從表中的相關資料也會被修改
on delete cascade on update cascade:刪除和修改有級聯操作
on delete set null:主表總資料被刪除後,從表中相關資料為null
on update set null
3.示例
乙個使用者可有擁有多個訂單,乙個訂單只能屬於乙個使用者,一對多,在tb_order中使用外來鍵user_id關聯tb_user的id。
當刪除、更新tb_user中的主鍵時,與之關聯的tb_order要受到影響,比如
#tb_user中的一條記錄1chy abcd
#tb_order中一條記錄,10是tb_order的id,1是所屬user的id10 ...... 1
刪除tb_user中id=1這條記錄,或者更新id欄位的值,mysql會如何處理tb_order中與之關聯的記錄?
設計外來鍵時,mysql提供了4種外來鍵關聯策略
1、restrict 限制(預設策略)
要刪除tb_user中的記錄,或者更新主鍵欄位的值,如果tb_order中有記錄與之關聯,則不能刪除、更新(執行操作時會報錯)
2、cascade 級聯
刪除tb_user中的記錄時,會自動刪除tb_order中與之關聯的記錄;
修改tb_user中id欄位的值時,會自動修改tb_order中與之關聯的記錄的外來鍵字段的值(同步變化)。
3、no action 什麼也不做
刪除tb_user中的記錄,或者修改id欄位的值,但tb_order中有記錄與之關聯,可以刪除、更新,tb_order中與之關聯的記錄不作任何處理(資料不發生變化)。
此種策略需要儲存引擎支援,如果儲存引擎不支援,會自動換為restrict。
4、set null 置為null
刪除tb_user的記錄,或更新主鍵欄位的值,會自動將tb_order中與之關聯的記錄的外來鍵字段的值置為null。
這種方式有乙個要求:設計tb_order時,外來鍵user_id不能使用not null約束。
cascade用得最多,其次是restrict,未設定外來鍵關聯策略時預設為restrict(為了資料安全)。
mysql建立主外來鍵關聯 mysql主外來鍵建立心得
mysql主主外來鍵建立 1 確保參照的表和字段是存在的 2 關聯表必須是innodb儲存型別 3 必須設定主關聯表主鍵 4 主鍵與外來鍵資料型別和字元編碼 unsigned 必須一致 5 確保以上宣告的句法是正確的 附 mysql建立表預設型別為 myisam 如果要改變預設表型別可在my.inf...
mysql主外來鍵
自己的 總提示 error 1005 can t create table errno 150 的錯誤鬱悶了好幾天,看了下面的文章終於成功了,犯了下面提到的三情況中的第三種,太不細心了,居然忽略了 unsigned 大家也要多留意呀!參照完整性 referentialintegrity 是資料庫設計...
mysql查詢主外來鍵
查詢資料庫的所有主外來鍵 select table name 表名 constraint name 主 外來鍵名稱 column name 欄位名 referenced table name 主表名稱 referenced column name 主表字段 from information sche...