回顾上一笔记:
update xxx set ...
delete from xxx where ...
select * from xxx
insert into xxx value()

一、主键约束

1、主键约束

使某个字段不重复且不得为空,确保表内所有数据的唯一性。

mysql>create table user(id int primary key,name varchar(20));
mysql> insert into user values(1,"zhangsan");
//mysql> insert into user values(1,"zhangsan");
//ERROR 1062 (23000): Duplicate entry '1' for key 'user.PRIMARY' //主键是序号,再加一个1重复了,报错
//mysql> insert into user values(NULL,"zhangsan");
//ERROR 1048 (23000): Column 'id' cannot be null //主键为空了报错mysql> insert into user values(2,"zhangsan");
mysql> select * from user;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | zhangsan |
+----+----------+

2、联合主键

多个主键,这里面每个主键都不能为空,并且加起来不重复即可

mysql> create table user2(-> id int,-> name varchar(20),-> password varchar(20),-> primary key(id,name) //在最后声明主键-> );
mysql> insert into user2 values(1,'zhangsan','123');//mysql> insert into user2 values(1,'zhangsan','123');
//ERROR 1062 (23000): Duplicate entry '1-zhangsan' for key 'user2.PRIMARY' 不能所有主键都重复
mysql> insert into user2 values(2,'zhangsan','123');
//Query OK, 1 row affected (0.00 sec) 有个别主键不重复的即可插入

3、自增约束

主键由系统自动递增分配

mysql> create table user3(-> id int primary key auto_increment,-> name varchar(20)-> );
//mysql> insert into user3 values('zhangsan'); //错误写法
mysql> insert into user3 (name) values('zhangsan'); //正确写法,多了(自增主键)mysql> insert into user3 (name) values('zhangsan');
mysql> select * from user3;
+----+----------+
| id | name     |
+----+----------+
|  1 | zhangsan |
|  2 | zhangsan |
+----+----------+

3、后期添加&删除主键约束

如果忘记设置主键,还可以通过sql语句设置(两种方式)

alter table user  add primary key(id);
alter table user  modify id int primary key;
alter table user  drop primary key;

二、唯一约束

1、唯一约束

该字段的值不可以重复。与主键约束的区别:

  • 主键约束只能有一个,并且不重复不为空;
  • 唯一约束的字段仅仅是数值上的不重复,可以为空,可以多个。
mysql> create table user5(-> id int,-> name varchar(20)-> );
mysql> alter table user5 add unique(name); //后设置name为唯一约束
mysql> desc user5;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(20) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+mysql> insert into user5 values(1,'zhangsan');
//mysql> insert into user5 values(1,'zhangsan');
//ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'user5.name'张三重复,报错
mysql> insert into user5 values(1,'lisi');
mysql> insert into user5 values(1,NULL);mysql> select * from user5;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
|    1 | lisi     |
|    1 | NULL     |
+------+----------+//上述间接创建unique约束,下面直接unique约束
mysql> create table user5(-> id int,-> name varchar(20),-> unique(name)-> );
mysql> create table user5(-> id int,-> name varchar(20) unique-> );

2、多个唯一约束

有点像联合主键。

mysql> create table user8( id int, name varchar(20),unique(id,name) );
mysql> insert into user8 values(1,'zhangsan');//mysql> insert into user8 values(1,'zhangsan'); //多个字段都一样才算重复
//ERROR 1062 (23000): Duplicate entry '1-zhangsan' for key 'user8.id'
mysql> insert into user8 values(2,'zhangsan'); //其中有字段不一样就没关系
mysql> insert into user8 values(1,'lisi');
mysql> select * from user8;
+------+----------+
| id   | name     |
+------+----------+
|    1 | lisi     |
|    1 | zhangsan |
|    2 | zhangsan |
+------+----------+

3、添加&删除唯一主键

alter table user  add unique(name);
alter table user  modify name varchar(20) unique;
alter table user  drop index name;

三、非空约束

修饰的字段不能为空

mysql> create table user9(-> id int,-> name varchar(20) not null-> );
mysql> desc user9;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(20) | NO   |     | NULL    |       | //这里null默认值为no,表明不能为空
+-------+-------------+------+-----+---------+-------+//mysql> insert into user9 (id) values(1); //注意这里只对id赋值,所以user9后面有(id)
//ERROR 1364 (HY000): Field 'name' doesn't have a default value
mysql> insert into user9 values(1,'zhangsan');
mysql> insert into user9 (name) values('lisi'); // 只对李四赋值,依然ok,name非空即可
mysql> select * from user9;
+------+----------+
| id   | name     |
+------+----------+
|    1 | zhangsan |
| NULL | lisi     |
+------+----------+

移除非空约束

alter table user  modify name varchcar(20);

四、默认约束

约定某个字段的默认值

mysql> create table user10( -> id int,-> name varchar(20),-> age int default 10-> );
mysql> desc user10;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(20) | YES  |     | NULL    |       |
| age   | int         | YES  |     | 10      |       | //默认为10
+-------+-------------+------+-----+---------+-------+mysql> insert into user10 (id,name) values(1,'zhangsan');
mysql> select * from user10;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   10 |
+------+----------+------+mysql> insert into user10 values(1,'zhangsan',19);
mysql> select * from user10;
+------+----------+------+
| id   | name     | age  |
+------+----------+------+
|    1 | zhangsan |   10 |
|    1 | zhangsan |   19 |
+------+----------+------+

移除默认约束

alter table user  modify age int;

五、外键约束

涉及到父表,子表(主表副表),主表的数据被副表引用。

//classes主表
mysql> create table classes(-> id int primary key,-> name varchar(20)-> );
//students副表
mysql> create table students(-> id int primary key,-> name varchar(20),-> class_id int,-> foreign key(class_id) references classes(id) -> ); //foreign的意思是上方的class_id的字段值参考classes表中的id,注意references加s
mysql> insert into classes values(1,"yiban");
mysql> insert into classes values(2,"erban");
mysql> insert into classes values(3,"sanban");
mysql> insert into classes values(4,"siban");
mysql> insert into students values(1001,'zhangsan',1);
mysql> insert into students values(1002,'zhangsan',2);
mysql> insert into students values(1003,'zhangsan',3);
mysql> insert into students values(1004,'zhangsan',4);mysql> insert into students values(1005,'zhangsan',5);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
//主表中不存在的记录5,不可以在附表中添加mysql> delete from classes where id = 4; //注意删的是主表中的
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `classes` (`id`))
//当前主表中的记录正被别人引用着,不可删

要想比别人优秀,就要比别人多付出两倍的努力。

编程一五八俱乐部SQL学习笔记-2-mysql建表中的约束相关推荐

  1. oracle复制另一个字段,【学习笔记】Oracle存储过程 表中列不同时动态复制表中数据到另一个表中...

    天萃荷净 分享一篇关于Oracle存储过程实现表之间数据复制功能.两表中列不同,动态的将一表中的数据复制到另一个表中案例 因为要用到回收站功能,删除一条记录,要先放到一个delete表中,以便以后恢复 ...

  2. SQL学习笔记:库和表的创建

    目录 创建和删除数据库 创建和删除表 添加.修改和删除字段 创建和删除数据库 CREATE DATABASE justForLearn; DROP DATABASE justForLearn; 创建和 ...

  3. 简简单单 My SQL 学习笔记(2)——分组和简单数据的查询

    初始数据 创建表(要记得先选择好我们的数据库 use+数据库名) create table student( studentno int(4) primary key not null auto_in ...

  4. 《SAS编程与数据挖掘商业案例》学习笔记之十六

    <SAS编程与数据挖掘商业案例>学习笔记,本次重点:sas宏变量 内容包括:宏变量.宏函数.宏参数.通配函数.字符函数.计算函数.引用函数.宏语句.宏应用 1.宏触发器: %name-to ...

  5. 让多核CPU占用率曲线听你指挥(Windows实现)——《编程之美》1.1学习笔记

    让多核CPU占用率曲线听你指挥--<编程之美>1.1学习笔记 Problem: 写一个程序,让用户来决定Windows任务管理器(Task Manager)的CPU占用率.有以下几种情况: ...

  6. SQL学习笔记_Aliyun4

    SQL学习笔记_Aliyun4 本笔记为阿里云天池龙珠计划SQL训练营的学习内容,链接为:https://tianchi.aliyun.com/specials/promotion/aicampsql ...

  7. 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)

    Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...

  8. 《SAS编程与数据挖掘商业案例》学习笔记之十九

    继续<SAS编程与数据挖掘商业案例>学习笔记,本文侧重数据处理实践,包括:HASH对象.自定义format.以及功能强大的正则表达式 一:HASH对象 Hash对象又称散列表,是根据关键码 ...

  9. 《SAS编程与数据挖掘商业案例》学习笔记之十四

    继续<SAS编程与数据挖掘商业案例>学习笔记系列,本次重点:常用全程语句 所谓全程语句,是指可以用在任何地方的sas语句,既可以用在data数据步语句里面,也可以用在proc过程步里面,甚 ...

最新文章

  1. 传图识字有次数限制吗_5岁娃识字3000?别羡慕!过早逼娃认字,后果很严重
  2. 提气!清华成立集成电路学院,专研“卡脖子”技术
  3. pyhton 中的字符串切片问题
  4. 新冠肺炎疫情把科研推上“云端”
  5. 余承东:华为 P50 系列无 5G 版本,但依然流畅
  6. Python基础中一些高效的数据操作,可以提高你十倍工作效率
  7. VTK:Qt之EventQtSlotConnect
  8. Java番外篇2——jdk8新特性
  9. 2.1基本算法之枚举_1812完美立方
  10. Go实现Raft第一篇:介绍
  11. java 7个数排序_JAVA基础(7)-数组的排序
  12. 二叉树前序遍历python输出_[宜配屋]听图阁 - Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例...
  13. JS--我发现,原来你是这样的JS:面向对象编程OOP[3]--(JS继承)
  14. Windows免杀木马+维持权限(shellter)
  15. win10镜像无法再此计算机上运行,Win10镜像无法安装提示“运行此工具时出现问题”的两种解决方案...
  16. 过年发生的,WinM7推出,MeeGo诞生,iPhone香肠
  17. 路线指示箭头的生成——两个Vector3计算Distance,Rotation
  18. c语言判断获取位置字符,C语言 · 判定字符位置
  19. 曾经一个程序员把BUG变成了彩蛋,这个程序员却把彩蛋变成了BUG
  20. 在寒冬“激流勇进”的BlockTower与其它基金有何不同?

热门文章

  1. UVa 109 - SCUD Busters(凸包)
  2. HOWTO:通过 VBA 在 FrontPage 2003 中建立自定义 HTML 代码检查程序
  3. 嵌入式软件工程师面试题(三)
  4. 计算机应用教学对象分析,编辑演示文稿计算机应用基础教材分析学情分析教学目标重点难点 .ppt...
  5. python ValueError: source code string cannot contain null bytes
  6. 买电脑需要考虑的电脑配置
  7. C# 实现生成一维码、二维码
  8. Very Deep Convolutional Networks for Large-Scale Image Recognition-VGGNet解读
  9. Selenium(Java)-使窗口最大化
  10. 慈溪2021高考学校成绩查询,2021年宁波各高中高考成绩排名及放榜最新消息