03 数据库入门学习-完整性约束、关联关系

一、完整性约束

1.什么是约束

  为了保证数据的合法性与完整性,对字段进行了除了数据类型以外添加额外的约束。

2.not null

  2.1意义

    not null是非空约束,数据不能为空

  2.2语法

create table student (id int,name char(10) not null);#名字不能为空

3.default

  3.1意义

    default  默认值约束,可以指定字段的默认值

  3.2语法

create table user (id int,name char(10) not null,sex char(5) default "woman");

#当在一个大多数的情况都为一个值的时候,就可以用默认约束

4.unique

  4.1意义

    unique   唯一性约束,该字段的值不能重复。比如,身份证,手机号,学号

    unique其实是一种索引,索引是一种数据结构,用于提高查询效率。

    unique可以为空,一张表中可以有多个唯一约束

  4.2语法

    单列唯一约束

create table t5(idcard char(18) unique);

    多列联合唯一约束

create table t6(idcard char(18),phonenumber char(11),unique(idcard,phonenumber));
#意思: 身份证相同 并且 手机号相同 那就叫相同

5.primary key

  5.1意义

    primary key称之为主键约束,用于唯一标识表中一条记录。

    如何能做到唯一标识?

      该字段,只要是唯一的,并且不为空即可。也就是说,从约束的角度来看主键约束和非空加唯一约束没有区别

    那它们之间的区别是什么?

      唯一约束,是一种索引,必然存在硬盘上的某个文件中,是物理层面(实实在在存在的数据)
      primary key,是一种逻辑意义上的数据(实际上不存在)
      换句话说,主键就是由唯一约束和非空约束 组成的约束

    有主键和没有主键的区别?
      1.无法区分两个相同记录,比如班级里有两个人名字相同
      2.有主键则意味有这索引,效率更高
      3.可以建立关联关系

  5.2语法

create table stu (stuid int primary key,name char(3));
#create table stu(stuid int unique not null,name char(3));

  多列联合主键:

create table t8(idcard char(18),phonenumber char(11),primary key(idcard,phonenumber));
#注意复合主键必须同时建立或者同时删除

6.auto_increment

  6.1意义

    auto_increment ,自动增长,通常搭配主键字段使用,可以自动为你的数据分配逐渐
    如何分配的?
      添加一条就自动加1 计数从1开始

  6.2语法

create table t9(id int primary key auto_increment,name char(3));

  如果主键是自动增长的,当你执行insert操作时要注意,插入的时候可以跳过这个字段或者插入的时候为null

  修改自动增长的起始位置

alter table t9 auto_increment = 7;

7.foreign key

  7.1意义

      foreign key 专门用于为表和表之间建立物理关联

    现在有两张表,员工表和部门表

      1. 从员工出发 员工对于部门来说 时 多个员工对应一个部门
      2. 从部门出发 一个部门对应多个员工

    虽然有了关系,但是两个表之间还是没有任何物理联系,插一个不存在的部门也没问题。

    所以就需要外键来是的员工表和部门表产生关联。

    添加外键约束时: 产生的限制
      被关联的表需要先被创建
      部门数据(主表)应该先插入 员工数据(从表)后插入
      在删除部门数据前(主表)前 要保证该部门的员工数据都删除了
      在更新部门编号前 要先保证没有员工关联到这个部门

    简单的说 外键指的是 另一张的主键

      外键加上以后 主表中的数据 删除 和更新时 都受到限制

  7.2语法

    先创建部门表(主表)

create table dept(id int primary key auto_increment,name char(10),manager char(10));

    在创建员工表(从表)

create table emp(id int primary key auto_increment,name char(10),dept_id int,foreign key(dept_id) references dept(id));

8.级联操作

8.1意义

   常用于外键,指的是就是主表与从表同步更新和删除

8.2语法

create table class(id int primary key auto_increment,namechar(10));
create table student(
id int primary key auto_increment,
name char(10),
c_id int,
foreign key(c_id) references class(id)
on update cascade#同步更新
on delete cascade#同步删除
);

#对主表的id进行更新
#以及删除某条主表记录 来验证效果

二、关联关系

1.一对多或多对一

表:学校表和课程表
关系:一个学校有多个课程
1 创建学校表:有学校id,学校名称,地址
create table school(id int primary key auto_increment,
name char(10),
address char(20)
);

2 创建课程表:有课程id,课程名称,课程价格,课程周期,所属学校
create table course(id int primary key auto_increment,
name char(10),
price int,
period char(5),
school_id int,
foreign key(school_id)
references school(id)
on update cascade
on delete cascade
);

3.创建学校
insert into school(name,address) values
(‘oldboyBeijing‘,‘北京昌平‘),
(‘oldboyShanghai‘,‘上海浦东‘)
;

4.创建课程
insert into course(name,price,period,school_id) values
(‘Python全栈开发一期‘,20000,‘5个月‘,2),
(‘Linux运维一期‘,200,‘2个月‘,2),
(‘Python全栈开发20期‘,20000,‘5个月‘,1)
;

2.一对一

表:学生表和客户表
关系:一个学生对应一个客户
#一定是student来foreign key表customer,这样就保证了:
#1 学生一定是一个客户,
#2 客户不一定是学生,但有可能成为一个学生

1.创建客户表
create table customer(
id int primary key auto_increment,
name varchar(20) not null,
qq varchar(10) not null,
phone char(16) not null
);

2.创建学生表
create table student(
id int primary key auto_increment,
class_name varchar(20) not null,
customer_id int unique, #该字段一定要是唯一的
foreign key(customer_id) references customer(id) #外键的字段一定要保证unique
on delete cascade
on update cascade
);

3.增加客户
insert into customer(name,qq,phone) values
(‘李飞机‘,‘31811231‘,13811341220),
(‘王大炮‘,‘123123123‘,15213146809),
(‘守榴弹‘,‘283818181‘,1867141331),
(‘吴坦克‘,‘283818181‘,1851143312),
(‘赢火箭‘,‘888818181‘,1861243314),
(‘战地雷‘,‘112312312‘,18811431230)
;

4.增加学生
insert into student(class_name,customer_id) values
(‘脱产3班‘,3),
(‘周末19期‘,4),
(‘周末19期‘,5)
;

3.多对多

表:学生表和老师表
关系:一个学生上过多个老师的课,一个老师教过多个学生

1.创建老师表
create table teacher (id int primary key auto_increment,name char(10));

2.创建学生表
create table student (id int primary key auto_increment,name char(10));

#为了避免重复无用的关系数据  关系表加上关联的主键约束
3.创建关联表
create table t_s (t_id int,
s_id int,
foreign key(t_id) references teacher(id),
foreign key(s_id) references student(id),
primary key(t_id,s_id)
);

4插入数据
insert into student value(null,"lxx");
insert into teacher value(null,"exx");
insert into t_s value(1,1);

原文地址:https://www.cnblogs.com/ouyang99-/p/10354768.html

时间: 2024-10-13 03:21:45

03 数据库入门学习-完整性约束、关联关系的相关文章

数据库入门学习

一.初识数据库 1.数据库的由来 怎么才能把数据永久保存下来,根据我们以前的所学,文件处理就可以将数据永久存储. 但是文件处理有很大的问题 1.管理不方便 2.文件操作效率问题 3.一个程序不太可能仅运行在同一台电脑上 那么为了解决这些问题,采取了提高计算机性能的方式 1.垂直扩展 指的是更换性能更好的硬件 2.水平扩展 指的就是添加更多的计算机 把任务分配给每一台 (分布式计算) 分布式计算 的好处 1.其中某一台挂了 不会导致整个系统瘫痪 稳定性高 2.理论上性能可以无限扩展 基于分布式计算

02 数据库入门学习-数据类型

一.数据存储引擎 1.什么是引擎 ? 引擎是一个功能的核心部分,现实中的引擎可以被分类.从动力来源来说,引擎可以分为汽油. 柴油.电动.混合动力等,需求场景的不同催生了不同的引擎类别. 在数据库中同样也是有引擎的.核心功能是存储数据 涉及到存储数据的代码 就称之为存储引擎 根据不同的需求,也有着不同的引擎分类. 创建表时在最后指定引擎名称 engine = xxx create table t1(id int)engine=innodb create table t2(id int not nu

04 数据库入门学习-单表查询、多表查询、子查询

1.复制表 #创建了一张测试表 mysql>create table test (id int primary key auto_increment,name char(10)); #显示原表结构 mysql> desc test; +-------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+----------+---

06 数据库入门学习-视图、sql注入、事务、存储过程

一.视图 1.什么是视图 视图本质是一张虚拟的表 2.为什么要用 为了原表的安全 只要有两大功能 1.隐藏部分数据,开放指定数据 2.视图可以将查询结果保存,减少sql语句的次数 特点: 1.视图使用永久保存的,而且保存的仅仅是一条 as sql语句 2.每次对视图的查询,都是再次执行了保存的sql语句 3.对于视图的任何修改都会同步到原表 3.如何使用 语法: create view 视图名 as select * from 原表名; 验证:对视图的任何修改会改变原表  验证 二.sql注入

05 数据库入门学习-正则表达式、用户管理、pymysql模块

一.正则表达式 正则表达式用于模糊查询,模糊查询已经讲过了 like 仅支持 % 和 _ 远没有正则表达式灵活当然绝大多数情况下 like足够使用 #语法 select *from table where name regexp "正则表达式"; #实例 #准备数据 create table emp (id int,name char(10),sex char,age int,dept_id int,job char(10),salary double); insert into em

《NOSQL数据库入门》学习笔记

<nosql数据库入门> 第1章 nosql数据库的基础知识 1 1.1 关系型数据库和nosql数据库 2 1.1.1 什么是nosql 2 1.1.2 关系型数据库简史 2 1.1.3 数据库的分类 3 1.1.4 关系型数据库的优势 5 1.1.5 关系型数据库的不足 5 1.1.6 nosql数据库 9 1.2 nosql数据库是什么 12 1.2.1 键值存储 13 1.2.2 面向文档的数据库 14 1.2.3 面向列的数据库 14 1.3 如何导入nosql数据库 16 1.3.

03.风哥Oracle数据库入门必备Linux基础系列视频教程(Oracle零基础教程)

03.风哥Oracle数据库入门必备Linux基础系列视频教程(Oracle零基础教程)链接:https://pan.baidu.com/s/19C4vzPKq8EwKtJublmIB3w 提取码:lez8 请分享链接到5个QQ IT交流群后,加入以下QQ群找群主获取更多免费视频. 更多视频教程,请加入QQ群(只加一个即可):189070296336282998 原文地址:http://blog.51cto.com/oracle18c/2314272

【数据库】9.0 MySQL入门学习(九)——获得数据库和表的信息、日期计算、查询

1.0 SELECT语句用来从数据表中检索信息. SELECT what_to_select FROM which_table WHERE conditions_to_satisfy; what_to_select指出你想要看到的内容,可以是列的一个表,或*表示"所有的列". which_table指出你想要从其检索数据的表. WHERE子句是可选项,如果选择该项,conditions_to_satisfy指定行必须满足的检索条件. 2.0 在我的博文"MySQL入门学习(八

mybatis入门学习

一.mybaits简介 java程序中常用的数据库框架. 二.mybait入门学习 1.环境 创建一个java或者javaweb项目:我是创建了一个structs项目,helloworld 2.添加相应的jar包