MySQL 学习笔记(三)

约束

什么是约束?常见的约束有哪些呢?
	在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的
	合法性、有效性、完整性。
	常见的约束有哪些呢?
		非空约束(not null):约束的字段不能为NULL
		唯一约束(unique):约束的字段不能重复
		主键约束(primary key):约束的字段既不能为NULL,也不能重复(简称PK)
		外键约束(foreign key):...(简称FK)
		检查约束(check):注意Oracle数据库有check约束,但是mysql没有,目前mysql不支持该约束。

非空约束 not null

drop table if exists t_user;
	create table t_user(
		id int,
		username varchar(255) not null,
		password varchar(255)
	);
	insert into t_user(id,password) values(1,'123');  //编译错误,约束username字段不能为空!
	ERROR 1364 (HY000): Field 'username' doesn't have a default value

	insert into t_user(id,username,password) values(1,'lisi','123');

唯一性约束(unique)

唯一性约束修饰的字段具有唯一性,不能重复。但可以为null。

案例:给某一列添加 unique
      drop table if exists t_user;
      create table t_user(
        id int,
		username varchar(255) unique  //
	);
	insert into t_user values(1,'zhangsan');		
	insert into t_user values(2,'zhangsan');  //出现编译错误,唯一性约束,该字段与上一行字段重复,但可以为null!
	ERROR 1062 (23000) : Duplicate entry 'zhangsan' for key 'username'

	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)  //多个字段联合起来添加一个约束unique 【表级约束】
 	  );

	insert into t_user values(1,'111','zs');
	insert into t_user values(2,'111','ls');
	insert into t_user values(3,'222','zs');
	select * from t_user;
	insert into t_user values(4,'111','zs');  //出现编译错误!
	ERROR 1062 (23000) : Duplicate entry '111-zs' for key 'usercode'

	drop table if exists t_user;
	create table t_suer(
	    id int,
	    usercode varchar(255) unique,【列级约束】  
	    username varchar(255) unique
	  );
	insert into t_user values(1,'111','zs');
	insert into t_user values(2,'111','ls');
	ERROR 1062 (23000) : Duplicate entry '111' for key 'usercode'
  * 注意:not null约束只有列级约束,没有表级约束。

主键约束 primary key

怎么给一张表添加主键约束呢?

drop table if exists t_user;
create table t_user(
    id int primary key,  //【列级约束】  
	username varchar(255),
	email varchar(255)
);
insert into t_user(id,username,email) values(1,'zs','zs@123.com');
insert into t_user(id,username,email) values(2,'ls','ls@123.com');
insert into t_user(id,username,email) values(3,'ww','ww@123.com');

insert into t_user(id,username,email) values(1,'jack','jack@123.com');  //出现编译错误,主键约束,不能为null也不能重复!

主键的特点:不能为null,也不能重复。

主键相关的术语?
      主键约束 :primary key
      主键字段 : id字段添加primary key之后,id叫做主键字段
      主键值 :id字段中的每一个值都是主键值。

主键有什么作用?
      根据主键字段的字段数量来划分:
          单一主键 (推荐的,常用的。)
	  复合主键(多个字段联合起来添加一个主键约束) (复合主键不建议使用,因为复合主键违背三范式。)
      根据主键性质来划分:
          自然主键 :主键值最好就是一个和业务没有任何关系的自然数。(这种方式是推荐的)
	  业务主键 : 主键值和系统的业务挂钩,例如:拿着银行卡的卡号做主键、拿着身份证号做为主键。(不推荐使用)
	             最好不要拿着和业务挂钩的字段做为主键。因为以后的业务一旦发生改变的时候,主键也可能需要随着
		     	 发生变化,但有的时候没有办法变化,因为变化可能会导致主键重复。
		     	 
一张表的主键约束只能有1个。(必须记住)

使用表级约束方式定义主键:
      drop table if exists t_user;
      create table t_user(
          id int,
	  username varchar(255),
	  primary key(id)						【表级约束】  
	);
	insert into t_user(id,username) values(1,'zs');
	insert into t_user(id,username) values(2,'ls');
	insert into t_user(id,username) values(3,'ws');
	insert into t_user(id,username) values(4,'cs');
	select * from t_user;

	insert into t_user(id,username) values(3,'cx');  //出现编译错误!
	ERROR 1062 (23000) : Duplicate entry '4' for key 'PRIMARY'

	以下内容是演示一下复合主键,不需要掌握:
	    drop table if exists t_user;
	    create table t_user(
	        id int,
		username varchar(255),
		password varchar(255),
		primary key(id,username)
	     );
	    insert ......


mysql提供主键值自增:(非常重要。)
      drop table if exists t_user;
      create table t_user(
          id int primary key auto_increment,  //id字段自动维护一个自增的数字,从1开始,以1递增。
	      username varchar(255)
        );
      insert into t_user(username) values('a'); 
      insert into t_user(username) values('b');
      insert into t_user(username) values('c');
      insert into t_user(username) values('d');
      insert into t_user(username) values('e');
      insert into t_user(username) values('f');
      select * from t_user;

      提示:Oracle当中也提供了一个自增机制,叫做:序列(sequence)对象。

主键约束 foreign key

 删除数据的时候,先删除子表,再删除父表。
 添加数据的时候,先添加父表,再添加子表。
 创建表的时候,先创建父表,再创建子表。
 删除表的时候,先删除子表,再删除父表。

   drop table if exists t_student;
   drop table if exists t_class;

   create table t_class(
       cno int,
       cname varchar(255),
       primary key(cno)
     );

    create table t_student(
        sno int,
	sname varchar(255),
	classno int,
	primary key(sno),
	foreign key(classno) references t_class(cno)
      );
    
    insert into t_class values(101,'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx');
    insert into t_class values(102,'yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy');

    insert into t_student values(1,'zs1',101);
    insert into t_student values(2,'zs2',101);
    insert into t_student values(3,'zs3',102);
    insert into t_student values(4,'zs4',102);
    insert into t_student values(5,'zs5',102);
    insert into t_student values(6,'zs6',102);
    select * from t_class;
    select * from t_student;

   insert into t_student values(7,'lisi',103);  //编译错误,引用的103,父表中没有该字段!
    ERROR 1452 (23000) : Cannot add or update a child row :aforeign key constraint fails (bjpowernode INT YT......)

  * 外键值可以为NULL?
      外键可以为null。
      insert into t_student(sno, sname) values(6, 'xp');

  * 外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?
      注意:被引用的字段不一定是主键,但至少是具有unique约束,具有唯一性,不可重复!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值