MySQL中约束的作用是对表中的数据进行限定,保证数据的正确性,完整性,有效性。

分类:(1)主键约束 primary key(2)非空约束 not NULL (3)唯一约束 unique (4)外键约束 foreign key

    1.非空约束:限定数据非空,如果为空则不可以添加数据。

添加语法:(1)在创建表的时候添加: 列名 数据类型 NOT NULL

发现可以插入id为空的数据,但在现实生活中id不为空 那么就要去限定id:id INT NOT NULL,

(2)表已经创建完成时的非空约束:用到以前的修改语句,对name来进行限定非空

删除非空约束语法:与第二个创建方法类似,倒过来用就对了

发现姓名可以为空了。

    2.唯一约束:限定列值不能重复

添加语法与之前的非空约束一样,但是删除不一样,语法为 alter table drop index 列名,之前的删除方法没有用,虽然执行成功了,但是还是唯一的

注意:NULL值表示不确定,因此唯一约束限定的列值可以有多个NULL。

3.主键约束:就是非空且唯一。并且一个表只能有一个主键列,主键是表中记录的唯一标识,同样添加方法同上,但是删除不同。

语法:alter table 表名drop primary key;那么问题来了,为什么删除不指定哪个列呢,那是因为之前说过,主键只有一个,不用去区分。

发现又可以添加重复的id了,也可以为空。

    4.自动增长:某一列数值类型的,使用auto-increment可以用来完成自增,经常配合主键来使用也可以不用;

语法:列名 数据类型 primary key auto_increment;

注意:可以手动增长,也可以自动增长,而且只与上一条记录有关,把上一条的自增记录加一即为本行的数据;

我在插入的时候id写的是null但是查看表的时候却是8,再看下面的例子,我自己添加了一个id为12的数据,然后再次添加id为null的数据

发现自增的数字是12+1=13,因此自增数据的数值只与前一个数据的值有关。

    5.外键约束

新建一个表:

CREATE TABLE emp1 (
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR (30),
age INT,
dep_name VARCHAR(30),
dep_location VARCHAR(30)
); INSERT INTO emp1(NAME,age,dep_name,dep_location)VALUES('张三',20,'研发部','广州');
INSERT INTO emp1(NAME,age,dep_name,dep_location)VALUES('李四',21,'研发部','广州');
INSERT INTO emp1(NAME,age,dep_name,dep_location)VALUES('王五',20,'研发部','广州');
INSERT INTO emp1(NAME,age,dep_name,dep_location)VALUES('老王',20,'销售部','深圳');
INSERT INTO emp1(NAME,age,dep_name,dep_location)VALUES('大王',22,'销售部','深圳');
INSERT INTO emp1(NAME,age,dep_name,dep_location)VALUES('小王',18,'销售部','深圳');
SELECT * FROM emp1;

但是发现数据有冗余,其实可以做一个表的拆分,拆成两个表,一个存放员工信息,一个存放部门信息。

-- main table
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
department_name VARCHAR(30),
department_location VARCHAR(30)
);
-- vice table
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT -- 外键对应主表的主键
);
INSERT INTO department VALUES(NULL,'研发部','广州'),(NULL,'销售部','深圳');
INSERT INTO employee (NAME,age,dep_id)VALUES ('张三',20,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('李四',21,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('王五',21,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('老王',21,2);
INSERT INTO employee (NAME,age,dep_id)VALUES ('大王',21,2);
INSERT INTO employee (NAME,age,dep_id)VALUES ('二王',21,2);
SELECT * FROM department;
SELECT * FROM employee;

但是想把研发部删除,居然真的删除了,但是有人还是属于研发部,不符合逻辑,应该先把部门员工开掉,然后再去删除部门,这样数据就不正确了。

把两个表放入新构架设计器

发现这两个表没有任何的关联,但是要长生关联,因此要使用外键约束。

语法:创建表的时候create table 表名 (

.....

.....

外键列

constraint  外键名称 foreign key 外键列名称 reference 主表名称 (主表主键名称)【可以是主键,也可以是被唯一约束的列】

);

先删除两个表

-- main table
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
department_name VARCHAR(30),
department_location VARCHAR(30)
);
-- vice table
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT,
CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department (id)
);
INSERT INTO department VALUES(NULL,'研发部','广州'),(NULL,'销售部','深圳');
INSERT INTO employee (NAME,age,dep_id)VALUES ('张三',20,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('李四',21,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('王五',21,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('老王',21,2);
INSERT INTO employee (NAME,age,dep_id)VALUES ('大王',21,2);
INSERT INTO employee (NAME,age,dep_id)VALUES ('二王',21,2);
SELECT * FROM department;
SELECT * FROM employee;

发现结果没有变化,但是不能删除研发部了,因为有另外一张表引用着它。

再打开构架图发现已经有线段连接着两个表。属于一对多的关系

如果再添加员工信息但是如果部门不是1,2而是5,也会报错,保证数据的正确性,改为2号就可以

外键让表与表产生关系从而保证数据的正确性。

删除外键:语法:alter table 表名 drop foreign key 外键名;

ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;

删除之后可以随意更改更部门标号

在表创建后添加外键:alter table employee add constraint 外键名称 foreign key 外键列名称 reference 主表名称 (主表主键名称)【可以是主键,也可以是被唯一约束的列】;

ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department (id);

发现又不能添加不合格的部门编号了。

    6.级联操作

看上面的表如果想要更改部门id但是却不能更改,因为他在employee表中关联着数据,但是如果想要做到这个操作需要进行多步骤,先要把id置为NULL,然后再将NULL置为你想要改的数字,很麻烦,因此就出现了级联更新。

语法

create table 表名 (

.....

.....

外键列

constraint  外键名称 foreign key 外键列名称 reference 主表名称 (主表主键名称)【可以是主键,也可以是被唯一约束的列】on update cascade

);

当然也可在表创建之后添加与上面相同

先删除两个表

然后执行下列语句

-- main table
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
department_name VARCHAR(30),
department_location VARCHAR(30)
);
-- vice table
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT
);
INSERT INTO department VALUES(NULL,'研发部','广州'),(NULL,'销售部','深圳');
INSERT INTO employee (NAME,age,dep_id)VALUES ('张三',20,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('李四',21,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('王五',21,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('老王',21,2);
INSERT INTO employee (NAME,age,dep_id)VALUES ('大王',21,2);
INSERT INTO employee (NAME,age,dep_id)VALUES ('二王',21,2);
SELECT * FROM department;
SELECT * FROM employee;
DROP TABLE department;
DROP TABLE employee;
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department (id) ON UPDATE CASCADE;

这样在更改部门id的时候就会把与其关联的都改掉。

将销售部的id改为5,然后发现没有报错,查看employee表之后发现,他们的dep_id也随之更改

有更新当然要有删除:级联删除

语法

create table 表名 (

.....

.....

外键列

constraint  外键名称 foreign key 外键列名称 reference 主表名称 (主表主键名称)【可以是主键,也可以是被唯一约束的列】on delete cascade

);

-- main table
CREATE TABLE department(
id INT PRIMARY KEY AUTO_INCREMENT,
department_name VARCHAR(30),
department_location VARCHAR(30)
);
-- vice table
CREATE TABLE employee(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
age INT,
dep_id INT
);
INSERT INTO department VALUES(NULL,'研发部','广州'),(NULL,'销售部','深圳');
INSERT INTO employee (NAME,age,dep_id)VALUES ('张三',20,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('李四',21,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('王五',21,1);
INSERT INTO employee (NAME,age,dep_id)VALUES ('老王',21,2);
INSERT INTO employee (NAME,age,dep_id)VALUES ('大王',21,2);
INSERT INTO employee (NAME,age,dep_id)VALUES ('二王',21,2);
SELECT * FROM department;
SELECT * FROM employee;
DROP TABLE department;
DROP TABLE employee;
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department (id) ON DELETE CASCADE;

这是将研发部一列删除,这是去employee表发现,有关于研发部的数据都没有了

注意:级联删除存在弊端,如果删除则与其关联的数据全部删除,会造成数据的丢失,要在使用之前考虑清楚是否适合级联删除。

MySQL_约束的更多相关文章

  1. 05 MySQL_主键约束

    主键约束 主键: 用于表示数据唯一性的字段称为主键: 约束:就是对表字段添加限制条件 主键约束:保证主键字段的值唯一且非空: - 格式 : create table t1(id int primary ...

  2. .NetCore MVC中的路由(2)在路由中使用约束

    p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...

  3. ASP.NET Core的路由[5]:内联路由约束的检验

    当某个请求能够被成功路由的前提是它满足某个Route对象设置的路由规则,具体来说,当前请求的URL不仅需要满足路由模板体现的路径模式,请求还需要满足Route对象的所有约束.路由系统采用IRouteC ...

  4. SQL 约束

    先用设计器创建约束.再用代码创建约束.数据库约束是为了保证数据的完整性(正确性)而实现的一套机制见文件Employee.sql非空约束(选择复选框)主键约束(PK) primary key const ...

  5. mysql 外键约束备注

    梳理mysql外键约束的知识点. 1.mysql外键约束只对InnoDb引擎有效: 2.创建外键约束如下: DROP TABLE IF EXISTS t_demo_product; CREATE TA ...

  6. 如果你发现mysql的外键约束不管用了

    不知为何我机子上的mysql竟然默认关闭外键约束,导致我试了好多遍都可以插入非法值,以下语句可以开启约束 SET foreign_key_checks = 1; (0则关闭) 备忘

  7. C#的泛型的类型参数可以有带参数的构造函数的约束方式吗?

    Review后看到标题让我十分羞愧自己语文功底太差,估计...请见谅......我还特地把这句写回开头了...... 问题 前天遇到的一个问题,所以在MSDN发了个问,刚也丰富了下问题,关于泛型的. ...

  8. Mysql增加、删除和修改列属性和约束,和一些有用的查询语句

    最近在整理关于MySql的东西,把一些需要记录的东西写下来,以便以后查询和浏览,以下是一些操作技巧.添加表字段alter table` 表名称` add transactor varchar(10) ...

  9. MYSQL基础操作之数据约束与关联查询

    一.MYSQL约束 1.默认值约束,当字段没有插入值的时候,mysql自动给该字段分配默认值. 默认值的字段允许为空. 对默认值字段也可以插入null. CREATE TABLE STUDENT( I ...

随机推荐

  1. CSS基本样式-文本属性

    字体属性 文本属性呢,自我认为就是写文档的一些格式属性,例如:字体颜色,字体加粗,字体大小,字体类型等,而且我们在输出测试用例报告的时候也可以用到这些属性,对测试报告进行优化. <html> ...

  2. Java 使用JDBC连接查询操作数据

    import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.sql. ...

  3. 微信小程序 报错 “对应的服务器无效。控制台输入 showRequestInfo()可以获取更详细信息”

    之前做的项目突然无法读出数据了,一测试发现报这个错误==>对应的服务器无效.控制台输入 showRequestInfo()可以获取更详细信息,后来发现是SSL证书到期了.重新申请了一个证书,免费 ...

  4. hadoop批量命令脚本xrsync.sh传输脚本

    1.xrsync.sh脚本 #!/bin/bash if [[ $# -lt 1 ]] ; then echo no params ; exit ; fi p=$1 #echo p=$p dir=`d ...

  5. Vue 系列(一): Vue + Echarts 开发可复用的柱形图组件

    目录 前置条件 安装echarts 引入echarts 柱形图组件开发 在何时初始化组件? 完整的代码 记得注册组件!!! 本文归柯三(kesan)所有,转载请注明出处 https://www.cnb ...

  6. C#判断点是否在直线上

    判断点在直线上,实际上就是判断点到直线上的垂直距离.点到直线垂直距离为0,则点在线上.当然也可以误差设置误差几个像素. 参考资料并进行修改:http://blog.sina.com.cn/s/blog ...

  7. 利用ARouter实现组件间通信,解决子模块调用主模块问题

    如果你还没使用过ARouter请你按照这篇下面博客尝试使用下然后再往下看组件通信的内容(不然的话可能会懵逼)Android Studio接入ARouter以及简单使用 如果你使用过ARouter请继续 ...

  8. python gRPC简单示例

    Ubuntu18.04安装gRPC protobuf-compiler-grpc安装 sudo apt-get install protobuf-compiler-grpc protobuf-comp ...

  9. MWPhotoBrowser.bundle: bundle format unrecognized, invalid, or unsuitable

    今天在github下载了MWPhotoBrowser的demo想跑一下,却发现报了MWPhotoBrowser.bundle: bundle format unrecognized, invalid, ...

  10. iPad和iPhone上的应用程序图标

    iPad和iPhone上的应用程序图标 问:如何在iPad和iPhone使用我的应用程序包中的图标文件? 答:下面是处理文件的图标为iPhone专用的应用程序,iPad的专用应用程序,以及通用的应用程 ...