mysql--约束

约束

  1. 什么是约束?常见的约束有哪些?
    约束是为了保证数据的完整性,合法性,有效性.

    非空约束 (not null)
    唯一约束 (unique)
    主键约束 (primary key, PK) 既不能为null也不能重复
    外键约束 (foreign key, FK) …
    检查约束 (check) :注意Oracle数据库中有check约束,但mysql没有,目前mysql不支持该约束

  2. 非空约束
    mysql> drop table if exists t_user;
    mysql> create table t_user (
    -> username varchar(255) not null,
    -> password varchar(255)
    -> );
    mysql> insert into t_user(username, password) values(‘lancoff’, “1234”)
    -> ;
    Query OK, 1 row affected (0.05 sec)

    mysql> select * from t_user;
    ±---------±---------+
    | username | password |
    ±---------±---------+
    | lancoff | 1234 |
    ±---------±---------+

  3. 唯一性约束(unique)
    不能重复,但能为NULL。
    drop table if exists t_user;
    create table t_user(
    id int,
    username varchar(255) unique //列级约束
    );

    insert into t_user(id, username) values(1, ‘zhangsan’);
    insert into t_user(id, username) values(2, ‘zhangsan’);

    ERROR 1062 (23000): Duplicate entry ‘zhangsan’ for key ‘t_user.username’

    案例:给两个列或者多个列添加unique
    drop table if exists t_user;

    create table t_user(
    id int,
    usercode varchar(255),
    username varchar(255),
    unique(usercode, username) //表级约束
    );

    //unique(usercode, username) 两个属性不能同时重复,某一个重复是允许的.
    列级约束可以写成表级约束,unique()括号里只写一个字段名即可

    非空约束(not null)只有列级约束,没有表级约束

  4. 主键约束
    一张表的主键约束只能有一个

    怎么给一张表添加主键约束?
    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’);

    主键相关的术语:
    主键约束
    主键字段
    主键值

    主键有什么用?
    表的设计三范式中要求:第一范式就是要求任何一张表都应该有主键.
    主键是一条记录的唯一标识.

    主键的分类:
    根据主键字段的字段数量来划分
    单一主键(推荐)
    复合主键(不建议使用,违背了三范式)
    根据主键性质来划分:
    自然主键
    业务逐渐(主键值和系统的业务挂钩,例如:拿银行卡号做主键. 不建议这么使用)

     注意:最好不要拿着和业务挂钩的字段作为主键.因为业务一旦发生改变的时候,主键值可能也需要修改,因为主键约束的存在,修改主键值往往造成值的重复.
    

    使用表级的方式定义主键约束:
    drop table if exists t_user;
    create table t_user(
    id int,
    username varchar(254),
    email varchar(255),
    primary key(id)
    );

    mysql提供主键值自增:
    drop table if exists t_user;

     create table t_user(
     	id int primary key auto_increment,
     	username varchar(255),
     	email 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');
     
    提示:Oracle当中也提供了一些自增机制,叫做:序列(sequence)
    
  5. 外键约束
    相关术语:
    外键字段
    外键约束
    外键值

    业务背景:
    请设计数据库表,用来维护学生和班级的信息:

     	第一种方案:一张表存储所有数据
     	no(pk) 		name		classno		classname
     	--------------------------------------------------
     	1			zs1			101			实验高中高二1班
     	2			zs2			101			实验高中高二1班
     	3			zs3			102			实验高中高二2班
     	4			zs4			102			实验高中高二2班
     	5			zs5			102			实验高中高二2班
     	
     	缺点:冗余, 教室名字多次重复
    
     	第二种方案:两张表(班级表,学生表)
     	t_class
     	cno(pk) 		cname
     	------------------------------
     	101				实验高中高二1班
     	102				实验高中高二2班
    
     	t_student
     	no(pk) 		name		classno(fk)
     	---------------------------------
     	1			zs1			101			
     	2			zs2			101			
     	3			zs3			102			
     	4			zs4			102			
     	5			zs5			102	
    
     	t_student表中的数据的cno值只能取t_class表中已经出现的cno值,否则报错
    
     	将以上的建表语句写出来:
     	t_student中的classno字段引用t_class表中的cno字段,此时t_student表被称为子表,t_class表被叫做父表.
     	
     	先创建父表在创建子表,删表的时候先删子表再删父表, 因为子表需要使用父表的字段.(理解记忆)
    
     	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 (
     		no int primary key,
     		name varchar(255),
     		classno int,
     		foreign key(classno) references t_class(cno) 
     	);
    
     	insert into t_class values(101, 'xxxxxxxx');
     	insert into t_class values(102, 'yyyyyyyy');
    
     	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, 'zs6', 103);
     	ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`bjpowernode`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
    
     外键值可以为NULL吗?
     insert into t_student(no, name) values(8, 'zs8');
     select * from t_student;
     +----+------+---------+
     | no | name | classno |
     +----+------+---------+
     |  1 | zs1  |     101 |
     |  2 | zs2  |     101 |
     |  3 | zs3  |     102 |
     |  4 | zs4  |     102 |
     |  5 | zs5  |     102 |
     |  6 | zs6  |     102 |
     |  8 | zs8  |    NULL |
     +----+------+---------+
    
     外键字段引用其他表的字段的时候,被引用的字段必须是主键吗?
     	不是,但别的字段必须保证有唯一性.
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL-xmind 是一种将 MySQL 数据库架构可视化为思维导图的工具。它可以帮助开发人员更好地理解和管理数据库结构。 使用 MySQL-xmind,我们可以通过图形化的方式表示数据库中的表、字段、关系和约束等元素。这样做可以使得数据库设计更加直观、易于理解。通过思维导图的形式,我们可以清楚地看到表之间的关系,如外键约束和关联关系。这对于开发人员在编写 SQL 查询和构建复杂查询时非常有帮助,因为他们可以更轻松地理解表之间的连接和关联。 此外,MySQL-xmind 还可以帮助我们进行数据库的维护和优化。我们可以使用思维导图来查看表的索引、主键和其他约束,从而更好地了解数据库的性能和结构。通过检查思维导图,我们可以发现潜在的问题,如冗余数据、不合理的索引或缺失的关联。 一些功能强大的特性,如批量生成 SQL 语句、导出导入数据库结构等,也使得 MySQL-xmind 成为一个非常实用的工具。它允许我们快速生成 SQL 脚本,以便在不同的环境中部署数据库结构。同样地,我们可以将数据库结构导出为思维导图,方便与团队成员共享和讨论。 总之,MySQL-xmind 是一个方便实用的工具,可以对 MySQL 数据库的结构进行可视化管理和优化。它帮助了开发人员更好地理解数据库的设计和关系,并提供了一些非常有用的功能,如批量生成 SQL 语句和导出导入数据库结构等,使得数据库管理更加高效和便捷。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值