为什么要外建

为了信息的冗余,使列表信息的比较规整

1,当直接使用添加让人们的信息的时候

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','山西大同');

在这里插入图片描述
2,这里的可以看出这里的信息fuliuqingfeng ,123456的为信息都为同一个人,当需要确定个人的信息比较多的时候,就需要在每一个格子里都需要 填写就比较不简洁。其中那个primary key 为主键:要求字段值不能重复不允许为null,就需要来进行外键。
刚第一步的时候就需要我们可以进行对重复信息进行包装,但这也还是不行因为里面的信息使可以随时改动的。

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','山西大同');

问题:这种表结构消除了字段冗余,但由于只是逻辑上的“外键”关系,所以依然无法保证数据完整性,例如可以将user_info中id为51b28fe1-4ebf-41ac-a17b-d5e276861fd0的数据删除,但此时地址表中数据将不再完整——找不到这些地址属于哪个用户;再例如也可以向address表中添加一条user_info_id不存在的地址信息(如:insert into address (id,user_info_id,real_name,mobile,address) values (‘7da42cc6-36a6-4ad5-9998-71dbc30c8e17’,‘ddc376dd-f8b3-42a6-b42a-db22abed1941’,‘xiaowang’,‘18338970095’,‘北京东城区’);)——同样,该条数据并不完整,依然找不到这些地址属于哪个用户。
在这里插入图片描述
3,解决上面外键残留问题:添加constraint address_user_info_id_fk foreign key(user_info_id) references user_info(id)在主存信息中,其中的bfb9472a-7911-4e6f-a479-3b719454ebab为张三的id信息,前面的id为李四,王五的,这里的三个一样的51b28fe1-4ebf-41ac-a17b-d5e276861fd0’都是fuliuqingfeng 的id,也就相当于一个人买东西给不同的发货则不同的收货地址。

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,
  constraint address_user_info_id_fk 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','山西大同');

说明:这种方案为user_info_id添加了外键,指向user_info表的主键,该约束起到了保护数据完整性的作用:如果删除的用户信息id已经在address表中使用,则该条数据无法删除;无法向address表中添加用户id不存在的地址信息。
下面当添加不是和原来包装的冗余id值相同信息的时候匹配的时候,就无法添加出现报错。
在这里插入图片描述
在包装的冗余结构中可以添加其他人信息,当外面的人调用他的id使用的时候这个冗余的信息就不能被删除
下面是user_inof的内容
在这里插入图片描述
这里面当还在冗余结构中在添加新的id时候,在其他结构中调用这个id的时候,则这个信息就不可以删除,没被其他人调用的时候就可以删除。当id信息11111没有被其他结构调用使用的时候,可以删除了。 当11111被使用也就不可以了,删除会报错。
在这里插入图片描述

当要清空包装冗余table表中信息时会报错,因为信息已经被address占用。,若想要解决这个问题就要先清空address中的信息才能清空上面包装的内容。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值