Mysql之约束&概念模型

一:约束:是添加在列上的,用来约束列的
主键约束
非空约束
唯一约束
外键约束

二:概念模型
对象模型(java实体类)
关系模型(数据库中的表)
一对一,一对多,多对多!



1.1:主键约束特点(唯一标识)
非空,唯一,被引用(一般会被外键引用!),
主键自增长(可以保证主键:非空和唯一!):AUTO_INCREMENT

CREATE TABLE stu(
    -- 指定sid为主键并设置自动增长!
	sid	  INT PRIMARY KEY AUTO_INCREMENT,
	sname	VARCHAR(20),
);

假如创建了一个表,不记得加主键,想后来补上!

修改表时指定主键:ALTER TABLE stu ADD PRIMARY KEY(sid);
删除主键:ALTER TABLE stu DROP PRIMARY KEY;

主键自增长

CREATE TABLE stu(
      sid   INT PRIMARY KEY AUTO_INCREMENT,
      sname	VARCHAR(20)
  );

-- 如下都会自动设置主键的值!
insert into stu values(null,'wzj');
insert into stu(sname) values('hg');
修改表时设置主键自增长:ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
修改表时删除主键自增长:ALTER TABLE stu CHANGE sid sid INT;


1.2:非空约束
因为某些列不能设置为NULL值,所以可以对列添加非空约束

 -- 对sname设置了非空约束
 CREATE TABLE stu(
		sid INT PRIMARY KEY AUTO_INCREMENT,
		sname	VARCHAR(20) NOT NULL
  );
  

 

1.3:唯一约束
因为某些列不能设置为重复的值,所以可以对列添加唯一约束

 -- 对手机号设置成了唯一 
 CREATE TABLE stu(
		sid INT PRIMARY KEY AUTO_INCREMENT,
		sname	VARCHAR(20) NOT NULL,
		phoneNumber VARCHAR(20) UNIQUE
  );


1.4:外键约束
A:外键一般要引用一个表的主键
B:外键可以重复,可以为空,但不可以引用一个不在的主键!
C:一张表中可以有多个外键!


用个例子“我有多台车”的例子说明 A,B两点
先来分析一下我和车的关系:
人和车: 一个人可以有多辆车,但一辆车只属于一个人,所以是人和车是一对多的关系,因为物以稀为贵,所以人是主表,车是从表
,而且多方是引用一方的,就相当于外键引用主键,就说明车里面有一个外键是指向人里面的主键!!

-- 一方是主表
create table person(
	pid int primary key auto_increment,
	pname varchar(20)

);

insert into person(pid,pname) values(1001,'wzj');
insert into person values(1002,'dyt');

select * from person;

-- 多方是从表!
create table car(
	cid int primary key auto_increment,
	cname varchar(20),
	-- 外键
   pid int,
  constraint fk_car_person foreign key(pid) references person(pid)
);


-- 外键是引用一个主键,而且引用的主键可以重复,可以为空,但是不能没有!

insert into car(cid,cname,pid) values(1,'法拉利',1001);
insert into car(cid,cname,pid) values(2,'奔驰',1001);
insert into car(cid,cname,pid) values(3,'宾利',null);
-- insert into car(cid,cname,pid) values(4,'宝马',1003); 会报错!

 

下面这个例子:用来说明C点
部门和我的关系是一对多,班级和我的关系也是一对多,所以我是从表,多方引用一方,外键引用主键
就说明在我的表中,有两个外键分别指向部门的主键和班级的主键

create table department(
	did int primary key auto_increment,
  dname varchar(20)
);


create table class(
	cid int primary key auto_increment,
  cname varchar(20)
);


create table my(
	mid int primary key auto_increment,
  mname varchar(20),
	did int,
	cid int,
  constraint  fk_my_department foreign key(did) references department(did),
  constraint  fk_my_class      foreign key(cid) references department(cid)
);




注:一般先创建主表(一的那方),再创建从表(多的那方),这样等创建从表的时候就可以用外键引用主表中的主键了

外键的语法
语法:CONSTRAINT 约束名称 FOREIGN KEY(外键列名) REFERENCES 关联表(关联表的主键) 


  创建表时指定外键约束
  create talbe emp (
    empno int primary key,
    ...
    deptno int,
    CONSTRAINT fk_emp FOREIGN KEY(mgr) REFERENCES emp(empno)  
  );

  修改表时添加外键约束
  ALERT TABLE emp
  ADD CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno);

  修改表时删除外键约束
  ALTER TABLE emp
  DROP FOREIGN KEY fk_emp_deptno;/*约束名称*/

 

二:概念模型
对象模型:可以双向关联,而且引用的是对象,而不是一个主键!在java中是domain!!!例如:User、Student(实体类)
关系模型:只能多方引用一方,而且引用的只是主键,而不是一整行记录。在数据库中表

一对一,一对多,多对多:分别用对象模型和关系模型描述一下! 
注:一对多跟多对一是一回事,只是考虑问题的不同角度罢了!
比如:一个爸爸有多个女儿,从爸爸的角度来看,一对多,从女儿们的角度来看是多对一!!!

 2.1:Java中的体现:

  //1. 一对一
  class Employee {//多方关联一方
     ...
     private Department department;
  }
  class Department {//一方关联多方
     ...
     private List<Employee> employees;
  }

  // 2. 一对一
  class Husband {
     ...
     private Wife wife;
  }
  class Wife {
     ...
     private Husband
  }

  //3. 多对多
  class Student {
     ...
     private List<Teacher> teachers
  }
  class Teacher {
     ...
     private List<Student> students;
  }

 2.2:在数据中的表中的体现!!
 2.2.1:一对一关系:在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键

-- 一对一!我和老婆
create table wife(
	wid int primary key auto_increment,
	wname varchar(20)
);

insert into wife values(null,'dyt');
insert into wife values(null,'西施');
insert into wife values(null,'妲己');

select * from wife;

-- 所以hid即是主键也是外键! 主键:非空,唯一, 外键: 引用主键!
create table husband(
	hid int primary key,
	hname varchar(20),
  constraint fk_husband_wife foreign key(hid) references wife(wid) 
);

insert into husband values(1,'wzj');
insert into husband values(2,'张三');
insert into husband values(3,'李四');
-- insert into husband values(4,'王五');  -- 不符合外键的特性:引用了没有的主键!

select * from husband;

2.2.2:一对多关系: 

-- 一方是主表
create table person(
	pid int primary key auto_increment,
	pname varchar(20)

);

insert into person(pid,pname) values(1001,'wzj');
insert into person values(1002,'dyt');

select * from person;

-- 多方是从表!
create table car(
	cid int primary key auto_increment,
	cname varchar(20),
	-- 外键
  pid int,
  constraint fk_car_person foreign key(pid) references person(pid)
);


-- 外键是引用一个主键,而且引用的主键可以重复,可以为空,但是不能没有!

insert into car(cid,cname,pid) values(1,'法拉利',1001);
insert into car(cid,cname,pid) values(2,'奔驰',1001);
insert into car(cid,cname,pid) values(3,'宾利',null);
-- insert into car(cid,cname,pid) values(4,'宝马',1003); 会报错!

select * from car;

 2.2.3:多对多关系:在表中建立多对多关系需要使用中间表,即需要三张表,在中间表中使用两个外键,分别引用其他两个表的主键。

-- 多对多需要使用第三张表,也就是中间表,
create table teacher(
	tid int primary key,
  tname varchar(20)
);


insert into teacher(tid,tname) values(1,'王老师');
insert into teacher(tid,tname) values(2,'张老师');
insert into teacher(tid,tname) values(3,'李老师');

select * from teacher;


create table student(
	sid int primary key,
  sname varchar(20)
);

insert into student(sid,sname) values(1,'马云同学');
insert into student(sid,sname) values(2,'马化腾同学');
insert into student(sid,sname) values(3,'乔布斯同学');

select * from student


create table stu_teach(
	sid int,
	tid int,

	constraint fk_student foreign key(sid) references student(sid),
	constraint fk_teacher foreign key(tid) references teacher(tid)
);

insert into stu_teach(sid,tid) values(1,1);
insert into stu_teach(sid,tid) values(1,2);
insert into stu_teach(sid,tid) values(1,3);

select * from stu_teach

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值