為什麼需要外來鍵?

2021-10-10 20:31:32 字數 4300 閱讀 2465

我們先執行以下的**:

#外來鍵

drop table user_info;

create table user_info(

id char(36) primary key,

user_name varchar(30) not null,

password varchar(30) not null,

real_name varchar(8),

mobile char(11),

address varchar(150)

);insert into user_info (id,user_name,password,real_name,mobile,address)

values ('51b28fe1-4ebf-41ac-a17b-d5e276861fd0','fuliuqingfeng','123456','張三','18920120206','河南安陽');

insert into user_info (id,user_name,password,real_name,mobile,address)

values ('cc95772b-75a2-4702-bd99-4c3b0322d606','fuliuqingfeng','123456','李四','18617297545','北京海淀');

insert into user_info (id,user_name,password,real_name,mobile,address)

values ('c63028fd-cf8d-4dac-a278-b5cc8fd61e3c','fuliuqingfeng','123456','王五','17694976949','山西大同');

select *from user_info

執行過後的結果如下顯示:

以上表結構存在嚴重的字段冗餘(user_name和password列),如果個人資訊字段比較多這一問題表現的越嚴重

drop table user_info;

create table user_info(

id char(36) primary key,

user_name varchar(30) not null,

password varchar(30) not null

);insert into user_info (id,user_name,password) values ('51b28fe1-4ebf-41ac-a17b-d5e276861fd0','fuliuqingfeng','123456');

create table address(

id char(36) primary key,

user_info_id char(36),

real_name varchar(8) not null,

mobile char(11) not null,

address varchar(150) not null

);insert into address (id,user_info_id,real_name,mobile,address)

values ('bfb9472a-7911-4e6f-a479-3b719454ebab','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','張三','18920120206','河南安陽');

insert into address (id,user_info_id,real_name,mobile,address)

values ('5227c6b9-45a2-44aa-8ac0-1f63a38d3b65','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','李四','18617297545','北京海淀');

insert into address (id,user_info_id,real_name,mobile,address)

values ('30b8584b-aa6a-4516-a623-03f487058586','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','王五','17694976949','山西大同');

但是,僅僅只是這樣的操作是不夠的,因為一旦刪除類使用者表中的id(即使用者登出了),其相應的位址表中的資料也就成廢物資料了,又或者直接新增毫無關聯的user_info_id資料進入位址表中,也會產生廢物資料。以上兩種情況會造成資料並不完整,找不到這些位址屬於哪個使用者。這兩種情況的命令如下:

delete from user_info where id = '51b28fe1-4ebf-41ac-a17b-d5e276861fd0';

insert into address (id,user_info_id,real_name,mobile,address) 

values ('30b8584b-aa6a-4516-a623-03f487058586','345frfe1m4ebf-42ac-a17bhd5e273861fd0','王五','17694976949','山西大同');//user_info_id在使用者表中不存在

為了避免以上情況發生,這就需要新增外來鍵來解決了。

#保證資料的完整性

drop table user_info;

drop table address;

create table user_info(

id char(36) primary key,

user_name varchar(30) not null,

password varchar(30) not null

);insert into user_info (id,user_name,password) values ('51b28fe1-4ebf-41ac-a17b-d5e276861fd0','fuliuqingfeng','123456');

create table address(

id char(36) primary key,

user_info_id char(36),

real_name varchar(8) not null,

mobile char(11) not null,

address varchar(150) not null,

foreign key (user_info_id) references user_info(id)

);insert into address (id,user_info_id,real_name,mobile,address)

values ('bfb9472a-7911-4e6f-a479-3b719454ebab','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','張三','18920120206','河南安陽');

insert into address (id,user_info_id,real_name,mobile,address)

values ('5227c6b9-45a2-44aa-8ac0-1f63a38d3b65','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','李四','18617297545','北京海淀');

insert into address (id,user_info_id,real_name,mobile,address)

values ('30b8584b-aa6a-4516-a623-03f487058586','51b28fe1-4ebf-41ac-a17b-d5e276861fd0','王五','17694976949','山西大同');

foreign key (user_info_id) references user_info(id)

說明:這種方案為user_info_id新增了外來鍵,指向user_info表的主鍵,該約束起到了保護資料完整性的作用:如果刪除的使用者資訊id已經在address表中使用,則該條資料無法刪除;無法向address表中新增使用者id不存在的位址資訊。

從另乙個方面說,要登出某個使用者,就必須先刪除掉其位址表中的資訊,再將其從使用者表中刪除。

為什麼需要外來鍵?

1.如何將京東fuliuqingfeng的使用者資訊及其多個郵寄商品位址儲存到資料庫中?values 51b28fe1 4ebf 41ac a17b d5e276861fd0 fuliuqingfeng 123456 張三 18920120206 河南安陽 insert into user info...

為什麼需要外來鍵

例如 如何將乙個使用者的使用者資訊及其多個郵寄商品位址儲存到資料庫中?資料特點 有較多的冗餘資料,即賬戶和密碼相同其他資訊有差別 方案一 create table user info 建立共享資訊 id char 36 primary key,id資訊為主鍵 user name varchar 30...

為什麼需要外來鍵

生活中例子的引入 如何將京東fuliuqingfeng的使用者資訊及其多個郵寄商品位址儲存到資料庫中?第一種方法是逐條輸入資料 create table user info id char 36 primary key,user name varchar 30 not null,password v...