mysql constraint报错_MySQL——约束(constraint)详细解释
约束是什么用来干嘛?
约束实际上就是表中数据的限制条件
作用:表在设计的时候加入约束的目的就是为了保证表中的记录完整和有效
比如一些字段的唯一性,将一些字段约束成外键
约束种类:
非空约束(not null)
唯一性约束(unique)
主键约束(primary key) PK
外键约束(foreign key) FK
检查约束(目前MySQL不支持、Oracle支持)
A、非空约束
用not null约束的字段不能为null值,必须给定具体的数据
创建表,给字段添加非空约束(创建用户表,用户名不能为空)
create table blog (
id int(12) not null;
)
insert插入数据时如果插入id为null直接报错
B、唯一性约束
unique约束的字段,具有唯一性,不可重复,但可以为null
创建表,保证邮箱地址唯一(列级约束)
create table blog (
id int(12) not null UNIQUE;
)
表级约束
create table blog (
id int(12) not null;
UNIQUE(id);
)
如果插入相同 id 会报错
使用表级约束,给多个字段联合约束
联合约束,表示两个或以上的字段同时与另一条记录相等,则报错
create table blog (
id int(12) not null;
name varchar(20) not null;
unique(id,name);
)
如果与联合字段都相同,则报错
表级约束可以给约束起名字(方便以后通过这个名字来删除这个约束)
create table blog (
id int(12) not null;
name varchar(20) not null;
CONSTRAINT t_id_name unique(id,name);
)
constraint是约束关键字,t_user_email_unique自己取的名字
C、主键约束(primary key)PK
表设计时一定要有主键
主键约束
主键字段
主键值表中的某个字段添加主键约束后,该字段为主键字段,主键字段中出现的每一个数据都称为主键值
主键约束与“not null unique”区别:给某个字段添加主键约束之后,该字段不能重复也不能为空,效果和”not null unique”约束相同,但是本质不同。
主键约束除了可以做到”not null unique”之外,还会默认添加”索引——index”一张表应该有主键字段,如果没有,表示该表无效
主键值:是当前行数据的唯一标识、是当前行数据的身份
即使表中两行记录相关数据相同,但由于主键值不同,所以也认为是两行不同的记录
按主键约束的字段数量分类:无论是单一主键还是复合主键,一张表主键约束只能有一个(约束只能有一个,但可以作用到好几个字段)
单一主键:给一个字段添加主键约束
复合主键:给多个字段联合添加一个主键约束(只能用表级定义)
1)单一主键(列级定义)
mysql> create table t_user(
-> id int(10) primary key,
-> name varchar(30)
-> );
Query OK, 0 rows affected (0.07 sec)
2)单一主键(表级定义)
mysql> create table t_user(
-> id int(10),
-> name varchar(30) not null,
-> constraint t_user_id_pk primary key(id)
-> );
Query OK, 0 rows affected (0.01 sec)
3)复合主键(表级定义)
mysql> create table t_user(
-> id int(10),
-> name varchar(30) not null,
-> email varchar(128) unique,
-> primary key(id,name)
-> );
Query OK, 0 rows affected (0.05 sec)
在MySQL数据库提供了一个自增的数字,专门用来自动生成主键值,主键值不用用户维护,自动生成,自增数从1开始,以1递增(auto_increment)
mysql> create table t_user(
-> id int(10) primary key auto_increment,
-> name varchar(30) not null
-> );
Query OK, 0 rows affected (0.03 sec)
插入两行记录,id主键值会自动增加
mysql> insert into t_user(name) values(‘jay‘);
Query OK, 1 row affected (0.04 sec)
mysql> insert into t_user(name) values(‘man‘);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t_user;
+----+------+
| id | name |
+----+------+
| 1 | jay |
| 2 | man |
+----+------+
2 rows in set (0.00 sec)
D、外键约束(foreign key)FK
只能是表级定义
foreign key(classno) references t_class(cno)
外键约束主要用来维护两个表之间数据的一致性
外键约束
外键字段
外键值
外键约束、外键字段、外键值之间的关系:某个字段添加外键约束之后,该字段称为外键字段,外键字段中每个数据都是外键值
按外键约束的字段数量分类:a、单一外键:给一个字段添加外键约束
b、复合外键:给多个字段联合添加一个外键约束
一张表可以有多个外键字段(与主键不同)
栗子:存储学生班级 信k 息
mysql> drop table if exists t_student;
mysql> drop table if exists t_class;
mysql> create table t_class(
-> cno int(10) primary key,
-> cname varchar(128) not null unique
-> );
mysql> create table t_student(
-> sno int(10) primary key auto_increment,
-> sname varchar(30) not null,
-> classno int(3),
-> foreign key(classno) references t_class(cno)
-> );
mysql> insert into t_class(cno,cname) values(100,‘aaaaaaxxxxxx‘);
mysql> insert into t_class(cno,cname) values(200,‘oooooopppppp‘);
mysql> insert into t_student(sname,classno) values(‘jack‘,100);
mysql> insert into t_student(sname,classno) values(‘lucy‘,100);
mysql> insert into t_student(sname,classno) values(‘king‘,200);
班级表t_class:
mysql> select from t_class;
+-----+--------------+
| cno | cname |
+-----+--------------+
| 100 | aaaaaaxxxxxx |
| 200 | oooooopppppp |
+-----+--------------+
学生表t_student:
mysql> select from t_student;
+-----+-------+---------+
| sno | sname | classno |
+-----+-------+---------+
| 1 | jack | 100 |
| 2 | lucy | 100 |
| 3 | king | 200 |
+-----+-------+---------+
上表中找出每个学生的班级名称:
mysql> select s.,c. from t_student s join t_class c on s.classno=c.cno;
+-----+-------+---------+-----+--------------+
| sno | sname | classno | cno | cname |
+-----+-------+---------+-----+--------------+
| 1 | jack | 100 | 100 | aaaaaaxxxxxx |
| 2 | lucy | 100 | 100 | aaaaaaxxxxxx |
| 3 | king | 200 | 200 | oooooopppppp |
+-----+-------+---------+-----+--------------+
这就是数据实体的一对多关系模型:在多的那一方加外键来约束
mysql constraint报错_MySQL——约束(constraint)详细解释相关推荐
- mysql floor报错_mysql的floor()报错注入方法详细分析
刚开始学习sql注入,遇见了 select count(*) from table group by floor(rand(0)*2); 这么条语句.在此做个总结. (更好的阅读体验可访问 这里 ) ...
- mysql replace报错_Mysql中replace与replace into的用法讲解
Mysql replace与replace into都是经常会用到的功能:replace其实是做了一次update操作,而不是先delete再insert:而replace into其实与insert ...
- mysql insert报错_mysql数据库使用insert语句插入中文数据报错
在mysql的命令行模式中,通过insert语句插入中文数据的时候报错,类似于下面这样: Incorrect string value: '\xE7\x8F' for column 'name' at ...
- mysql load报错_mysql:执行LOAD DATA LOCAL 报错
mysql:执行LOAD DATA LOCAL 报错. 我使用navicat for mysql 连接 mysql服务器执行local 可以正常执行 . show VARIABLES like '% ...
- mysql -u 报错_MySQL报错解决!
大家好:我是小狼,最近工作一直瞎忙,没时间写东西,终于有点时间了,现在我正在搭建extmail服务器,文档是参考这里:http://www.extmail.org/forum/thread-7002- ...
- mysql恢复 报错_Mysql 数据恢复报错
1.测试mysql binlog 数据恢复功能,我的mysql版本是5.7.17 2.删了数据之后,执行show binlog events 命令得到如下记录 3.找到开始删除和结束删除的位置,然后执 ...
- mysql主从报错_Mysql主从报错锦集
前言 在发生故障切换后,经常遇到的问题就是同步报错,下面是最近收集的报错信息. 记录删除失败 在master上删除一条记录,而slave上找不到 Last_SQL_Error: Could not e ...
- mysql 数据恢复 报错_Mysql 数据恢复报错
1.测试mysql binlog 数据恢复功能,我的mysql版本是5.7.17 2.删了数据之后,执行show binlog events 命令得到如下记录 3.找到开始删除和结束删除的位置,然后执 ...
- mysql cast报错_mysql数据库cast
关于 mysql数据库cast的搜索结果 问题 请教一下,Record中的getLong如何兼容Mysql.Oracle?报错 @JFinal 你好,想跟你请教个问题: Record中的getLong ...
最新文章
- dedecms部分文章出现读取附加信息出错的解决办法
- 目录文件和根目录文件夹
- 推荐算法-聚类-均值偏移聚类(爬山算法)
- 专家周 |360精确搜索VS今日头条精准推荐算法
- Python之将彩色图片批量转化为黑白图片
- 数组指针 和 指针数组
- elasticsearch例子(crud + 分页)
- blood vessel 图像分割_单图像九宫格形式发送朋友圈
- 【离散数学】滨江学院 期末考试 题库
- 中国教育和科研计算机网 吉林省,吉林大学—41核心节点—热烈庆祝中国教育和科研计算机网CERNET建设20周年—中国教育和科研计算机网CERNET...
- 小米平板4刷 linux,小米平板4_刷开发版_获取root
- matplotlib之hist
- python新版个人所得税代码_个人所得税计算代码
- 狂神说SpringMVC课堂笔记
- dell屏幕亮度调节不了_戴尔笔记本调节亮度不见了怎么办
- python假设税前工资和税率如下_计算税后收入_税前税后工资计算公式,软件和手动计算哪个更有优势?...
- 3D游戏开源引擎分析
- Using a password on the command line interface can be insecure.
- 模型理论5_建筑模型与沙盘制作课程教学总结
- 【Apache Spark 】第 5 章Spark SQL 和 DataFrames:与外部数据源交互