MySQL中的完整性约束条件(主键、外键、唯一、非空)
数据库的完整性约束用来防止对数据的意外破坏,来保证数据的安全性和一致性。
主键
1.创建表时候指定主键
创建表user(id, username, age),并且id字段非空自增。
CREATE TABLE user(
id BIGINT(20) NOT NULL AUTO_INCREMENT
,username VARCHAR(16) NOT NULL
,age TINYINT
,PRIMARY KEY(id)
);
给数据库插入3条字段。
2.修改表中字段为主键
创建表user1(id, username),不设置主键,通过修改设置主键。
CREATE TABLE user1(
id BIGINT(20)
,username VARCHAR(16) NOT NULL
);
ALTER TABLE user1
ADD PRIMARY KEY(id)
,MODIFY id BIGINT(20) AUTO_INCREMENT;
通过SHOW INDEX FROM user1查看表user1的主键,可以看到有一个名字为PRIMARY的主键索引。
3.删除主键
删除表user1中的主键,如果主键为自增,那么还需要将自增去掉。
ALTER TABLE user1
DROP PRIMARY KEY
,MODIFY id BIGINT(20);
外键
外键用来指定参照完整性约束,被指定为外键的列必需要有索引,外键参考列必需为另一个表的主键。
1.创建表的时候指定外键
创建表article(id, u_id, article_name),u_id为该表的外键,引用user表中的id。
CREATE TABLE article(
id BIGINT(20) NOT NULL AUTO_INCREMENT
,u_id BIGINT(20) NOT NULL
,article_name VARCHAR(16) NOT NULL
,PRIMARY KEY(id)
,CONSTRAINT fk_user_article_uid FOREIGN KEY (u_id) REFERENCES user(id)
);
通过SHOW INDEX FROM article查看索引,可以看到该表中有两个索引。
2.修改表时添加外键约束
修改的时候表中如果有记录就会出错。
ALTER TABLE article
ADD CONSTRAINT fk_user_article_uid FOREIGN KEY(u_id) REFERENCES user(id);
添加了外键之后,再插入不存在user的id值的u_id字段就会出错。
3.删除外键
ALTER TABLE article
DROP FOREIGN KEY fk_user_article_uid;
通过SHOW INDEX FROM article可以看到,虽然外键被删除,但是之前设置为外键的列依然有索引。
这时再进行插入操作,插入在user表中不存在的u_id值,这时可以成功地进行插入。
INSERT INTO article(u_id, article_name)
VALUES (4, 'article4');
唯一
1.创建表的时候创建唯一约束条件
第一种方法,这种方法不能指定唯一索引的名字。
CREATE TABLE test1(
id BIGINT(20) NOT NULL AUTO_INCREMENT
,test1 INT UNIQUE KEY
,PRIMARY KEY(id)
);
查看索引,可以看到唯一索引的名字与字段名相同。
如果插入相同的test1,就会报错。
第二种方法,可以制定唯一索引的名字
CREATE TABLE test1(
id BIGINT(20) NOT NULL AUTO_INCREMENT
,test INT
,PRIMARY KEY(id)
,UNIQUE KEY uk_test(test)
);
通过查看索引可以看到,非空索引的名称是设定的名称。
2.修改表时添加
ALTER TABLE test1
ADD UNIQUE uk_test(test);
3.删除
ALTER TABLE test1
DROP INDEX uk_test;
非空
1.创建表的时候指定
CREATE TABLE test(
id BIGINT(20) NOT NULL AUTO_INCREMENT
,test1 INT NOT NULL
,PRIMARY KEY(id)
);
2.修改删除
删除非空
ALTER TABLE test
MODIFY test1 INT;
添加非空
ALTER TABLE test
MODIFY test1 INT NOT NULL;
总结
上述的四种约束性添加中,主键、外键、唯一在创建时就直接建立了该列的索引,非空是与索引无关的,不过非空字段也是可以建立索引的。
MySQL中的完整性约束条件(主键、外键、唯一、非空)的更多相关文章
- EF中主表和附表一起提交的话,如果主附表的主键外键已经设定。
EF中主表和附表一起提交的话,如果主附表的主键外键已经设定,如果新增同时新增主表和附表的记录,那么在EF同时提交时,不需要人为的设定附表的主表的主键值,EF会自动为附表添加外键值.
- 通过 jdbc 分析数据库中的表结构和主键外键
文章转自:http://ivan4126.blog.163.com/blog/static/20949109220137753214811/ 在某项目中用到了 hibernate ,大家都知道 hib ...
- java面试一日一题:mysql中的自增主键
问题:请讲下mysql中的自增主键 分析:该问题主要考察对mysql中自增主键的掌握,使用场景及如何设置 回答要点: 主要从以下几点去考虑 1.什么自增主键 2.使用场景是什么: 3.innodb_a ...
- Sql Server 主键 外键约束
主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如果为 ...
- 第15课-数据库开发及ado.net-数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库
第15课-数据库开发及ado.net 数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库 1. 学习方法 2. 多涨见识 3. 比自己强的人一起,学习更强:比自己更聪明的人 ...
- 关系型数据库——主键&外键的
一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学 ...
- PowerDesigner中CDM和PDM如何定义外键关系
有A.B两张表(实体),各自有id作为主键,两表是一一对应关系.但略有不同: A表一条记录可以对应0或1条B表记录,B表一条记录必须对应唯一条A表记录. 这样的关系如何在CDM或PDM中定义? 在最后 ...
- Django笔记&教程 4-3 模型(models)主键外键
Django 自学笔记兼学习教程第4章第3节--模型(models)主键外键 点击查看教程总目录 参考:https://docs.djangoproject.com/en/2.2/ref/models ...
- Mysql主键外键操作
外键: ·一对多 ·多对多 ·一对一 ·修改表 ·复制表 主键: rimary key auto_increment(primary key是主键通常和auto_increment自动增加混合 ...
随机推荐
- zoj-3782-Ternary Calculation
题目链接 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5269 题目很简单,直接把所有情况列出来. 我的AC代码 #inclu ...
- swift 使用pod管理
在oc 中使用pod 管理第三方库还是很方便的 今天来在swift中使用pod 来管理第三方库 其实还是很简单的 和oc 区别不大 下面来说说我遇到的一些问题及解决方法 当然使用pod 你要先安装p ...
- SVG的path的使用
SVG的path的使用: 参考:http://justcoding.iteye.com/blog/2226354 <%@ page language="java" conte ...
- #DP# ----- OpenJudge最大子矩阵
OpenJudge 1768:最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 ...
- datatable 使用详细说明
要注意的是,要被dataTable处理的table对象,必须有thead与tbody,而且,结构要规整(数据不一定要完整),这样才能正确处理.以下是在进行dataTable绑定处理时候可以附加的参数: ...
- Winform ListView的用法
清除数据: lvOrder.Items.Clear(); 赋值数据: if (lvList.Count != 0) { foreach (var item in lvList) { string[] ...
- linux下的Source命令的基本功能
source命令用法:source FileName作用:在当前bash环境下读取并执行FileName中的命令.注:该命令通常用命令“.”来替代.如:source .bash_rc 与 . .bas ...
- Android开发系列之adb常用命令
对于Android开发者来说,如果没有adb的帮助,那肯定就跟少了一只手那样别扭.其实笔者在刚刚学习Android开发的时候,也没有意识到adb的重要性.想想只要用IDE画出界面,然后实现后台的逻辑代 ...
- 005.数组、for、foreach
1.方法的传输传递 值参数:传递的是副本 引用参数:自身 保留自定义的方法中对值的改变 形参影响实参ref:对应的形参和实参都用ref修饰 输出参数:实参不用赋值,但是自定义方法内必须对此参数赋值!! ...
- hdoj 2674 N!
N!Again Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...