0


MySQL数据库约束,表的设计

Author:老九
计算机专业
可控之事 沉重冷静 不可控之事 乐观面对
85180586@qq.com
😄 😆 😵 😭 😰 😅 😢 😤 😍 ☺️ 😎 😩

👍 👎 💯 👏 🔔 🎁 ❓ 💣 ❤️ ☕️ 🌀 🙇 💋 🙏 💦 💩 ❗️ 💢
————————————————
版权声明:本文为CSDN博主「浦上青天」的原创文章

文章目录

知识点

数据库约束

not null

  • 指定某列的存储不能为null值
createtable student (id intnotnull,name varchar(20));
Query OK,0rows affected (0.01 sec)

mysql>desc student;+-------+-------------+------+-----+---------+-------+| Field |Type|Null|Key|Default| Extra |+-------+-------------+------+-----+---------+-------+| id    |int(11)|NO||NULL||| name  |varchar(20)| YES  ||NULL||+-------+-------------+------+-----+---------+-------+2rowsinset(0.00 sec)

unique

  • 保证某列必须有唯一的值,插入重复的值就会报错

default

  • 规定给列赋值时的默认值
createtable student(id int,name varchar(20)default'匿名');

primary key 主键

  • 主键约束,是not null 与unique的结合,确保某列的赋值不能为null,并且是唯一的

auto_increment

  • 自增特点: 1.如果表中没有记录,自增从1开始 2.如果有数据,从上一条记录往下自增 3.插入再删掉数据,自增的值不会重复利用,会按删掉的那条开始自增
createtable student (id intprimarykeyauto_increment,name varchar(20));
Query OK,0rows affected (0.01 sec)

mysql>desc student;+-------+-------------+------+-----+---------+----------------+| Field |Type|Null|Key|Default| Extra          |+-------+-------------+------+-----+---------+----------------+| id    |int(11)|NO| PRI |NULL|auto_increment|| name  |varchar(20)| YES  ||NULL||+-------+-------------+------+-----+---------+----------------+2rowsinset(0.00 sec)

mysql>insertinto student values(null,'张三');
Query OK,1row affected (0.00 sec)

mysql>select*from student;+----+--------+| id | name   |+----+--------+|1| 张三   |+----+--------+1rowinset(0.00 sec)

foreign key 外键

  • 外键约束,在表一中的数据必须在表二中存在,要参照完整性准则
  • 外键约束描述的是两张表的两个列之间的“依赖关系”
  • 外键约束会影响表的删除,例如下面的实例的class表被关联,所以它不能被轻易删除
mysql>createtable class (-> id intprimarykey,-> name varchar(20)notnull->);
Query OK,0rows affected (0.04 sec)

mysql>createtable student (-> id intprimarykey,-> name varchar(20)notnull,-> email varchar(20)default'unknow',-> QQ varchar(20)unique,-> classId int,foreignkey(classId)references class(id)->);
Query OK,0rows affected (0.03 sec)

mysql>desc class;+-------+-------------+------+-----+---------+-------+| Field |Type|Null|Key|Default| Extra |+-------+-------------+------+-----+---------+-------+| id    |int(11)|NO| PRI |NULL||| name  |varchar(20)|NO||NULL||+-------+-------------+------+-----+---------+-------+2rowsinset(0.02 sec)

mysql>desc student;+---------+-------------+------+-----+---------+-------+| Field   |Type|Null|Key|Default| Extra |+---------+-------------+------+-----+---------+-------+| id      |int(11)|NO| PRI |NULL||| name    |varchar(20)|NO||NULL||| email   |varchar(20)| YES  || unknow  ||| QQ      |varchar(20)| YES  | UNI |NULL||| classId |int(11)| YES  | MUL |NULL||+---------+-------------+------+-----+---------+-------+5rowsinset(0.00 sec)

check

  • 指定一个条件,通过条件来对值进行判定
  • 但是mysql并不支持
createtable test_user (
   id int,
   name varchar(20),
   sex varchar(1),check(sex ='男'or sex='女'));

表的设计

一对一

  • 一对一设计表就比如学生表和账户表,一个账户对应到一个学生,一个学生也只有一个账户
  • 表示方法 1.可以把这两个实体用一张表来表示 2.可以用两张表来表示,其中一张表包含了另一个表的id

一对多

  • 一个学生应该处于一个班级中,一个班级可以包含多个学生
  • 表示方法: 1.在班级表中,新增一列,表示这个班级里的学生id都有啥(mysql没有数组类型,redis可以) 2.班级表不变,学生表中,新增一列classId

多对多

  • 多对多设计表就好比学生表和课程表,一个学生可以选多个课程,一个课程也可以被多个学生选择
  • 表示方法 : 使用一个关联表,来表示两个实体之间的关系

多对多建表实例

-- 学生表
mysql>createtable test_student (-> id intprimarykey,-> name varchar(10)default'unknow'->);
Query OK,0rows affected (0.03 sec)-- 选课表
mysql>createtable test_course (-> id intprimarykey,-> name varchar(20)default'unknow'->);
Query OK,0rows affected (0.02 sec)-- 成绩表
mysql>createtable test_score (-> studentId int,-> courseId int,-> score int,->foreignkey(studentId)references test_student(id),->foreignkey(courseId)references test_course(id)->);
Query OK,0rows affected (0.02 sec)

mysql>desc test_student;+-------+-------------+------+-----+---------+-------+| Field |Type|Null|Key|Default| Extra |+-------+-------------+------+-----+---------+-------+| id    |int(11)|NO| PRI |NULL||| name  |varchar(10)| YES  || unknow  ||+-------+-------------+------+-----+---------+-------+2rowsinset(0.00 sec)

mysql>desc test_coures;
ERROR 1146(42S02): Table'java_5_27.test_coures' doesn't exist
mysql>desc test_course;+-------+-------------+------+-----+---------+-------+| Field |Type|Null|Key|Default| Extra |+-------+-------------+------+-----+---------+-------+| id    |int(11)|NO| PRI |NULL||| name  |varchar(20)| YES  || unknow  ||+-------+-------------+------+-----+---------+-------+2rowsinset(0.00 sec)

mysql>desc test_score;+-----------+---------+------+-----+---------+-------+| Field     |Type|Null|Key|Default| Extra |+-----------+---------+------+-----+---------+-------+| studentId |int(11)| YES  | MUL |NULL||| courseId  |int(11)| YES  | MUL |NULL||| score     |int(11)| YES  ||NULL||+-----------+---------+------+-----+---------+-------+3rowsinset(0.00 sec)

插入数据到实例实现多对多

mysql>insertinto test_student values(1,'listen');
Query OK,1row affected (0.01 sec)

mysql>insertinto test_course values(1,'数学');
Query OK,1row affected (0.00 sec)

mysql>insertinto test_student values(2,'Faker');
Query OK,1row affected (0.00 sec)

mysql>insertinto test_course values(2,'数学');
Query OK,1row affected (0.00 sec)

mysql>insertinto test_score values(1,1,90);
Query OK,1row affected (0.00 sec)

mysql>insertinto test_score values(1,2,99);
Query OK,1row affected (0.00 sec)

mysql>insertinto test_score values(2,1,50);
Query OK,1row affected (0.00 sec)

mysql>insertinto test_score values(2,2,60);
Query OK,1row affected (0.00 sec)

mysql>select*from test_student;+----+--------+| id | name   |+----+--------+|1| listen ||2| Faker  |+----+--------+2rowsinset(0.00 sec)

mysql>select*from test_course;+----+--------+| id | name   |+----+--------+|1| 数学   ||2| 语文   |+----+--------+2rowsinset(0.00 sec)

mysql>select*from test_score;+-----------+----------+-------+| studentId | courseId | score |+-----------+----------+-------+|1|1|90||1|2|99||2|1|50||2|2|60|+-----------+----------+-------+4rowsinset(0.00 sec)

先赞后看,养成习惯!!!^ _ ^♥♥♥
每天都更新知识点哦!!!
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘记关注我哦!


本文转载自: https://blog.csdn.net/partworld/article/details/125120375
版权归原作者 浦浦浦浦浦 所有, 如有侵权,请联系我们删除。

“MySQL数据库约束,表的设计”的评论:

还没有评论