数据库约束与多表查询

数据库为什么会出现约束?数据库约束有什么作用?

小案例:假设一个网购平台买卖商品,那么他的数据库中一定会有商品表,用户表还有订单表。在这三个表中没有存在约束的话,那么这三个表可以被单独任意更改,我可以随意的删除用户,但是被删除的用户订单信息还是存在于订单表中,那么此时数据库中的数据就变得毫无意义,这也就体现了数据库表之间的约束的重要性。

数据库表之间的约束的作用:为了保证数据的有效性和完整性

以MySQL为例:MySQL中常见的约束:

  1. 主键约束(primary key)
  2. 自增长约束(auto_incrment)
  3. 唯一约束(unique)
  4. 非空约束(not null)
  5. 外键约束(foreign key)
  6. 非负约束(unsigned)
主键约束

主键约束:被修饰的主键字段唯一且非空
一张表只能有一个主键,但是可以用多个字段构成一个主键。(多个字段组合体就具备唯一且非空)
创建:
1.建表的同时添加约束 格式:字段名称 字段类型 primary key
2.建表的同时在约束区域添加约束 当所有字段声明完后就是约束区域
格式:create table user(
user_id int,
user_name varchar(10),
primary key(id)
)

3.建表之后,通过修改表结构添加约束
create table pk02(
id int,
username varchar(20)
);
alter table pk02 add primary key(字段名1,字段名2…);
alter table pk02 add primary key(id,username);

删除主键约束

1.该表的主键字段只有主键约束
(1). alter table 表名 drop primary key; – 这样只删除了唯一约束,该字段还有非空约束
(2). alter table [表名] modify [列名] [数据类型] null; --修改字段名还为原来的字段 加上null即可
2.该表的主键字段还具有自增长约束
只需要在前面的步骤增加删除自增长约束即可,其实就是修改自增长字段名和数据类型还为原来的字段名和类型
alter table 表名 change 字段名 字段名 数据类型; --删除自增长约束

唯一约束

唯一约束修饰的字段对null没有作用,也就是说该字段虽然具有唯一约束,但是也可以出现多个null值
创建:
1.建表的同时添加约束 格式: 字段名称 字段类型unique
create table un(
id int unique,
username varchar(20) unique
);

2.建表的同时在约束区域添加约束
3.alter table 表名 add unique(字段1,字段2);-- 添加的联合唯一
alter table 表名 add unique(字段1);-- 给一个添加唯一

非空约束

非空约束修饰的字段非空
创建方式:create table nn(
id int not null,
username varchar(20) not null
);

清空表

truncate 格式:
truncate 表名;删除表,重新创建一张空表
与delete from 有所区别:delete属于DML语句,truncate属于DDL语句,delete是逐条删除

ER图

我们在创建表之前,需要用ER图来展示出表之间的关系,以帮助我们更清晰的建立表之间的约束。
ER图中有如下成分:
矩形框:表示实体
菱形框:表示联系
椭圆形框:表示实体或联系的属性
连线:实体与属性之间,实体与联系之间用直线相连,要在实体连线方向表明是联系的形式(一对一,一对多,多对多)

一对多联系
开发中,关系中的一方称之为主表或者一表,关系中的多方称之为多表或者从表,为了表示一对多的关系,一般会在多表的一方添加一个字段,字段的类型一般和主表的主键类型保持一致,该字段就为外键。
用户和订单
– 创建用户表
create table user(
id int primary key auto_increment,
username varchar(20)
);

– 创建订单表
create table orders(
id int primary key auto_increment,
totalprice double,
user_id int
);

创建外键:
alter table 多表名称 add foreign key(外键名称) references 一表名称(主键);
eg:alter table orders add foreign key(user_id) references user(id);
添加外键约束后特点:
主表中不能删除从表中引用的数据
从表中不能添加主表中不存在的数据

添加外键后的数据删除:
1.级联删除:ALTER TABLE orders ADD FOREIGN KEY(user_id) REFERENCES users(id) ON DELETE CASCADE;
2.先删除带有外键的多表的数据,然后再删除主表中的数据

对于多对多的表之间的关系处理
引入一张中间表,存放两张表的主键,然后将这两个字段设置为联合主键,在中间表中添加两个外键约束,就可拆分为两个一对多的关系

多表查询
  • 内连接
  • 外连接
  • 子查询

内连接
1.显示的内连接
select a.,b. from a [inner] join b on ab的连接条件
2.隐示的内连接
select a.,b. from a,b where ab的连接条件
外连接
左外连接:
select a.,b. from a left [outer] join b on 连接条件; outer 可以不写
意思:
先展示join左边的(a)表的所有数据,根据条件关联查询 join右边的表(b),符合条件则展示出来,不符合以null值展示.
右外连接:
select a.,b. from b right [outer] join a on 连接条件; outer 可以不写
意思:
先展示jion右边的表(a)表的所有数据,根据条件关联查询join左边的表(b),符合条件则展示出来,不符合以null值展示.
子查询:一个查询依赖另一个查询

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值