课时4-10:约束(重要)

约束:增加在列上的,用来约束列的

主键约束(唯一标识)

特点:非空、唯一、被引用(学习外键时)

  • 当表的某一列被指定为主键后,该列就不能为空,不能有重复值出现
  • 创建表时指定主键的两种方式
 1. 指定sid列为主键列,即为sid添加主键约束
CREATE TABLE stu(
	sid        CHAR(6) PRIMARY KEY,
	sname    VACHAR(20),
	age        INT,
	gender    VACHAR(10)
);
 2. 指定sid列为主键列,即为主键约束设置为sid
CREATE TABLE stu(
	sid        CHAR(6),
	sname    VACHAR(20),
	age        INT,
	gender    VACHAR(10),
	PRIMARY KEY(sid)
);
  • 修改表时指定主键:ALTER TABLE stu ADD PRIMARY KEY(sid);
  • 删除主键:ALTER TABLE stu DROP PRIMARY KEY;
练习内容
CREATE TABLE emp (
  empno INT PRIMARY KEY,
  ename VARCHAR (50)
) ;
INSERT INTO emp VALUES(1,'zhangSan');
SELECT * FROM emp;
INSERT INTO emp VALUES(1,'liSi');
INSERT INTO emp VALUES(NULL,'wangWu');
DROP TABLE emp;

CREATE TABLE emp (
  empno INT,
  ename VARCHAR (50)
) ;

ALTER TABLE emp ADD PRIMARY KEY(empno);

ALTER TABLE emp DROP PRIMARY KEY;

主键自增长

  • 因为主键列的特性是:必须唯一、不能为空,所以我们通常会指定主键列为整型,然后设置为自控增长,这样可以保证在插入数据时主键列的 唯一和非空特性。
  • 创建表时指定主键自增长
CREATE TABLE stu (
  sid INT PRIMARY KEY AUTO_INCREMENT,
  sname VARCHAR (20),
  age INT,
  gender VARCHAR (10)
) ;
  • 修改表时设置主键自增长
ALTER TABLE stu CHANGE sid sid INT AUTO_INCREMENT;
  • 修改表时删除主键自增长
ALTER TABLE stu CHANGE sid sid INT;

非空约束

  • 因为某些列不能设置为NULL值,所以可以对列添加非空约束。
  • 例如
CREATE TABLE stu (
  sid INT PRIMARY KEY AUTO_INCREMENT,
  sname VARCHAR (20) NOT NULL,
  age INT,
  gender VARCHAR (10)
) ;

对sname列设置了非空约束

唯一约束

  • 某些列不能设置重复的值,所以可以对列添加唯一约束
    UNIQUE就是唯一约束的代码
CREATE TABLE stu (
  sid INT PRIMARY KEY AUTO_INCREMENT,
  sname VARCHAR (20) UNIQUE,
  age INT,
  gender VARCHAR (10)
) ;

概念模型

对象模型:可以双向关联,而且引用的是对象,而不是一个主键
关系模型:只能多方引用一方,而且引用的只是主键,而不是一整行记录

对象模型:在Java中是domain
关系模型:在数据库中的表

当我们要完成一个软件系统时,需要把系统中的实体抽取出来,形成概念模型。
例如部门、员工都是系统中的实体。概念模型中的实体最终会成为Java中的类、数据库中的表。
实体之间还存在这关系,关系有三种:

  • 1对多:例如每个员工都从属一个部门,而一个部门可以有多个员工,其中员工是多方,而部门是一方。
  • 1对1:例如一对夫妇,1个老公——1个老婆,1个老婆——1个老公。
  • 多对多:例如老师与学生,一个学生可以有多位老师,一个老师也可以有多位学生。

概念模型在Java中称为实体类(JavaBean)
类就使用成员变量来完成关系,一般都是双向关联!
多对一双向关联,即员工关联部门,部门也关联员工
多对一/一对多
class Employee {//多方关联一方

private Department department;
}

class Department {//一方关联多方

private List employees;
}

一对一
class Husband {

private Wife wife;
}

class Wife {

private Husband
}

多对多:
class Student {

private List teachers
}
class Teacher {

private List students;
}

外键约束

  • 外键必须是一个表(本表本身或另一张表)的主键的值(外键必须引用主键
  • 外键可以重复
  • 外键可以为空
  • 一张表可以有多个外键

首先创建dno表作为主表

创建emp表时加入外键约束:(约束名称为fk_emp_dept)

CREATE TABLE emp(
empno INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(50),
dno INT,
CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno) 
);

创建emp表后通过修改表加入外键约束

CREATE TABLE emp(
empno INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(50),
dno INT
);
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept FOREIGN KEY(dno) REFERENCES dept(deptno);

 ALTER TABLE emp  DROP FOREIGN KEY fk_emp_dept

一对一关系

在表中建立一对一关系比较特殊,需要让其中一张表的主键,即是主键又是外键。
例如:若把husband作为主表

 create table husband(
    hid int PRIMARY KEY AUTO_INCERMENT,
    ...
  );
  create table wife(
    wid int PRIMARY KEY,
    ...
    ADD CONSTRAINT fk_wife_wid FOREIGN KEY(wid) 
    REFERENCES husband(hid)
  );

其中wife表的wid即是主键,又是相对husband表的外键!
husband.hid是主键,不能重复!
wife.wid是主键,不能重复,又是外键,必须来自husband.hid。
所以如果在wife表中有一条记录的wid为1,那么wife表中的其他记录的wid就不能再是1了,因为它是主键。
同时在husband.hid中必须存在1这个值,因为wid是外键。这就完成了一对一关系。
从表的主键即是外键!

练习:

CREATE TABLE husband(
hid INT PRIMARY KEY AUTO_INCREMENT,
hname VARCHAR(50)
);

INSERT INTO husband VALUES(NULL,'刘备');
INSERT INTO husband VALUES(NULL,'关羽');
INSERT INTO husband VALUES(NULL,'张飞');
SELECT * FROM husband;

CREATE TABLE wife(
wid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(50),
CONSTRAINT fk_wife_husband FOREIGN KEY(wid) REFERENCES husband(hid)
);

/*wid 要求非空,唯一,引用hid*/

INSERT INTO wife VALUES(1,'杨贵妃');
INSERT INTO wife VALUES(2,'妲己');
INSERT INTO wife VALUES(3,'西施');
SELECT * FROM wife;

多对多关系

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

create table student(
    sid int PRIMARY KEY,
    ...
  );

  create table teacher(
    tid int PRIMARY KEY,
    ...
  );

//中间表两个外键,
  create table stu_tea(
    sid int,
    tid int,
    ADD CONSTRAINT fk_stu_tea_sid FOREIGN KEY(sid) 
    REFERENCES student(sid),
    ADD CONSTRAINT fk_stu_tea_tid FOREIGN KEY(tid) 
    REFERENCES teacher(tid)
  );

这时在stu_tea这个中间表中的每条记录都是来说明student和teacher表的关系。

练习:

CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(50)
);

CREATE TABLE teacher(
tid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(50)
);
#fk_student_teacher是sid的外键
#fk_teacher_student是tid的外键
CREATE TABLE student_teachar(
sid INT,
tid INT,
CONSTRAINT fk_student FOREIGN KEY(sid) REFERENCES student(sid),
CONSTRAINT fk_teacher FOREIGN KEY(tid) REFERENCES teacher(tid)
);

INSERT INTO student VALUES(NULL,'刘德华');
INSERT INTO student VALUES(NULL,'梁朝伟');
INSERT INTO student VALUES(NULL,'黄日华');
INSERT INTO student VALUES(NULL,'苗侨伟');
INSERT INTO student VALUES(NULL,'杨震业');

INSERT INTO teacher VALUES(NULL,'崔');
INSERT INTO teacher VALUES(NULL,'刘');
INSERT INTO teacher VALUES(NULL,'石');

SELECT * FROM student;
SELECT * FROM teacher;

INSERT INTO student_teachar VALUES(1,1);
INSERT INTO student_teachar VALUES(2,1);
INSERT INTO student_teachar VALUES(3,1);
INSERT INTO student_teachar VALUES(4,1);
INSERT INTO student_teachar VALUES(5,1);

INSERT INTO student_teachar VALUES(2,2);
INSERT INTO student_teachar VALUES(3,2);
INSERT INTO student_teachar VALUES(4,2);


INSERT INTO student_teachar VALUES(3,3);
INSERT INTO student_teachar VALUES(4,3);
INSERT INTO student_teachar VALUES(5,3);

SELECT * FROM student_teachar;
发布了88 篇原创文章 · 获赞 31 · 访问量 5059

猜你喜欢

转载自blog.csdn.net/weixin_43455338/article/details/104915931