数据库中为什么需要外键

1,创建表:例:

​
##use 数据库名
create table student(
id char(36)comment 'id标识符',
user_name varchar(12)comment '用户名',
password varchar (15)comment '密码',
address varchar(120)comment '地址'
)

后面可以不写comment,但为在design table时方便更清楚用处,后面单引号括出属性

2,重命名:例如:

rename table student to user_info

3,截断表:

truncate table user_info

等价于delete *from user_info,要提交事务。上面不用提交事务。结果是把表中内容清空。

4,unique:限制内容不能重复但可以为null;not null:限制不能为null,但可以是' ';也就是有unique修饰的,不能多次运行同样的内容,但内容定义时为null得话可以多次执行特记当内容是' ',也不能多次执行,可not null刚好相反,只要不被定义为null,都可以多次执行。primary key 是主键,限制内容不能重复且不能为null,就是相同内容不能执行多次。

5,default用在创建表的时候加在数据类型后,他后面跟单引号括起来的内容,(看数据类型变化是否加引号)当执行insert into...语句添加内容时若没有相应的为其赋值会自动定义为默认值。

6,删除表。例如:

drop table student

重点:外键

举例下:当创建一个user_info表:如将京东fuliuqingfeng的用户信息及其多个邮寄商品地址保存到数据库中,里面有相同内容,如果按常规来如下:

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

 

很冗余,现在重复的信息还不多,要是个人信息字段比较多这一问题表现的越严重。

解决方法一:

先将使用者相同信息集合到一个表中,令id唯一不为空

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)
);

再创建地址表存储变更信息 ,也有主键,但相应添加了使用者的主键

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

但,上面有缺陷,在地址表中若肆意添加使用者信息中不存在的主键,则无法找到正确连接的相关属性,于是有了:

constraint address_user_info_id_fk foreign key(user_info_id) references user_info(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不存在的地址信息。

也就是说,不能往address中添加user_info表中不存在的id信息,而且不能删除user_info中的已经被使用的信息,如要删除信息,先删除address中数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值