二十、约束

1、约束的定义:在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的就是为了保证表中数据的合法性、有效性、完整性

 

2、常见的约束有哪些?
  非空约束(not NULL):约束的字段不能为null
  唯一约束(unique):约束的字段不能重复
  主键约束(primary key):约束的字段不能为null,也不能重复,简称PK
  外键约束(foreign key):
  检查约束(check):主要Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束

 

3、非空约束: NOT NULL 

  CREATE TABLE t_user (
    id INT,
    username VARCHAR(255) NOT NULL,
    PASSWORD VARCHAR(255)
  );

INSERT INTO t_user(id,PASSWORD)VALUES(1,'123');    //错误代码: 1364     FIELD 'username' doesn't have a default value

注意:(约束的字段不能为空,否则报错),下面才是正确的
INSERT INTO t_user(id,username,PASSWORD)VALUES(1,'xiao','123');

 

4、唯一约束:unique

*唯一约束修饰的字段具有唯一性,不能重复,但是可以为NULL
*案例:
  CREATE TABLE t_user (
    id INT ,
    username VARCHAR(255) UNIQUE    //列级约束
  );
以下将会报错,因为username具有唯一性:
错误代码: 1062 DUPLICATE entry 'zhangsan' FOR KEY 'username'
INSERT INTO t_user VALUES(1,'zhangsan');
INSERT INTO t_user VALUES(2,'zhangsan');

字段可以为null值
INSERT INTO t_user(id)VALUES(2);
INSERT INTO t_user(id)VALUES(3);
INSERT INTO t_user(id)VALUES(4);

 

*案例:给多个列添加unique
  DROP TABLE IF EXISTS t_user;
    CREATE TABLE t_user (
    id INT ,
    usercode VARCHAR(255), 
    username VARCHAR(255),
    UNIQUE(usercode,username) //多个字段联合起来添加一个约束【表级约束】
  );
不会报错,因为是联合起来的,基本不会报错,除非字段完全相同
INSERT INTO t_user VALUES(1,'111','zs');
INSERT INTO t_user VALUES(2,'111','ls');
INSERT INTO t_user VALUES(3,'222','zs');


  DROP TABLE IF EXISTS t_user;
  CREATE TABLE t_user (
    id INT ,
    usercode VARCHAR(255) UNIQUE,
    username VARCHAR(255) UNIQUE
);
//以下报错,因为是列级约束,一个都不能重复
//错误代码: 1062 DUPLICATE entry '111' FOR KEY 'usercode'
INSERT INTO t_user VALUES(1,'111','zs');
INSERT INTO t_user VALUES(2,'111','ls');

非空约束只有列级约束,没有表级约束

 

5、主键约束:一般放在表中的一列,拥有了后面的数据信息
* 怎么给一张表添加主键约束?
  CREATE TABLE t_user1 (
    id INT PRIMARY KEY,
    username VARCHAR(255),
    email VARCHAR(255)
  );
  INSERT INTO t_user1(id,username,email)VALUES(1,'zs','zs@qq.com');
  INSERT INTO t_user1(id,username,email)VALUES(2,'ls','ls@qq.com');
  INSERT INTO t_user1(id,username,email)VALUES(3,'zw','zw@qq.com');
其中,id是主键,因为添加了主键约束,主键字段中的数据不能为null,也不能重复
如错误代码: 1062DUPLICATE entry '3' FOR KEY 'PRIMARY'
INSERT INTO t_user1(id,username,email)VALUES(3,'we','we@qq.com');
*主键相关的术语:
主键约束:primary KEY
主键字段:id字段添加primary key之后,id叫做主键字段
主键值:id字段中的每一个值都是主键值
*主键的作用:
-表的实际三范式中有要求,第一范式就要求任何一张表都应该有主键
-主键的作用:主键值是这行记录在这张表当中的唯一标识(就像一个人的身份证一样)
*主键的分类:
根据主键字段的字段数量来划分:
单一主键(推荐使用)
复合主键(不推荐使用)
根据主键性质划分:
自然主键:主键值最好就是一个和业务没有任何关系的自然数
业务主键:(不推荐使用)
*一张表的主键约束只能有一个。(很重要)
*使用表级约束方式定义主键:
  CREATE TABLE t_user2 (
    id INT,
    username VARCHAR(255),
    PRIMARY KEY(id)
  );
  INSERT INTO t_user2(id,username)VALUES(1,'zs');
  INSERT INTO t_user2(id,username)VALUES(2,'ds');
  INSERT INTO t_user2(id,username)VALUES(3,'fs');

*mysql提供了主键值自增
  CREATE TABLE t_user3 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(255)
  );
  INSERT INTO t_user3(username)VALUES('zs');
  INSERT INTO t_user3(username)VALUES('ds');
  INSERT INTO t_user3(username)VALUES('fs');
  KEY AUTO_INCREMENT为id字段自动维护一个自增的数字,从1开始,以1递增


 

6、外键约束
*术语:
外键约束:foregin KEY
外键字段:添加有外键约束的字段
外键值:外键字段中的每一个值
*业务背景:
请设计数据库,用来维护学生和班级的信息
第一种:用一张表存储所有的数据
NO NAME classname
1 zs1 高三1班
2 zs2 高三1班
3 zs3 高三2班
4 zs4 高三2班
5 zs5 高三2班
缺点:出现了冗余,不推荐使用
第二种:用两张表(班级表和学生表)

 

7、外键约束
*术语:
外键约束:foregin KEY
外键字段:添加有外键约束的字段
外键值:外键字段中的每一个值
*业务背景:
请设计数据库,用来维护学生和班级的信息
第一种:用一张表存储所有的数据
NO        NAME           classname   classno
1    zs1     高三1班      101
2      zs2     高三1班      101
3     zs3      高三2班     102
4      zs4     高三2班     102
5      zs5      高三2班     102
缺点:出现了冗余,不推荐使用
第二种:用两张表(班级表和学生表)
t_class1 班级表
cno(pk)      classname
101        高三1班
102       高三2班

t_student1 学生表
sno(pk)      sname      cno(该字段添加外键约束fk)
1          zs1        101
2          zs2        101
3          zs3        101
4         zs4        102
5          zs5        102

*顺序要求:
删除数据的时候,先删除字表,在删除父表
添加数据的时候,先添加父表,在添加子表
创建表的时候,先创建父表,在创建子表
删除表的时候,先删除子表,在删除父表
*创建表
CREATE TABLE t_class1 (
  cno INT,
  cname VARCHAR(255),
  PRIMARY KEY(cno)
);
CREATE TABLE t_student1 (
  sno INT,
  sname VARCHAR(255),
  classno INT,
  PRIMARY KEY(sno),
  FOREIGN KEY(classno)REFERENCES t_class1(cno) //添加外键,与t_class表连接
);
INSERT INTO t_class1 VALUES(101,'xxx');
INSERT INTO t_class1 VALUES(102,'yyy');

INSERT INTO t_student1 VALUES(1,'zs1',101);
INSERT INTO t_student1 VALUES(2,'zs2',101);
INSERT INTO t_student1 VALUES(3,'zs3',102);
INSERT INTO t_student1 VALUES(4,'zs4',102);
INSERT INTO t_student1 VALUES(5,'zs5',102);
INSERT INTO t_student1 VALUES(6,'zs6',102);


SELECT * FROM t_class1;
SELECT * FROM t_student1;

*外键值可以为null
外键字段引用其他表的某个字段的时候,被引用的字段不一定是主键,但至少具有unique约束


 

 

 

posted @ 2019-11-13 12:51  笔心  阅读(152)  评论(0)    收藏  举报