约束:增加在列上的,用来约束列的
主键约束(唯一标识)
特点:非空、唯一、被引用(学习外键时)
- 当表的某一列被指定为主键后,该列就不能为空,不能有重复值出现
- 创建表时指定主键的两种方式
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;