sql常用操作(二)数据约束
1.1什么是数据约束:
对用户操作表的数据进行约束
1.2 默认值
作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值。
注意:
1)对默认值字段插入null是可以的。
2)对默认值字段可以插入非null
最好在建表时就加好约束
例:
create table user01(
uid int,
uname varchar(10),
address varchar(20) default '北京'
);
/*当字段没有插入值的时候,mysql自动给该字段分配默认值*/
insert into user01(uid,uname) values (2,'王夏');
1.3非空
作用: 限制字段必须赋值
注意:
1)非空字符必须赋值
2)非空字符不能赋null
例:
create table user01(
uid int not null,
uname varchar(10),
address varchar(20) default '北京'
);
insert into user01(uname) values ('李秋');
结果报错:

1.4 唯一
作用: 对字段的值不能重复
注意:
1)唯一字段可以插入null
2)唯一字段可以插入多个null
例:
/*唯一约束*/
create table user01(
uid int not null,
uname varchar(10) unique,
address varchar(20) default '北京'
);
insert into user01(uid,uname) values (1,'张春');

再次:insert into user01(uid,uname) values (1,'张春');
报错:

1.5 主键
作用: 非空+唯一
注意:
1)通常情况下,每张表都会设置一个主键字段。用于标记表中的每条记录的唯一性。
2)建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的id字段。
语法:primary key
例:
/*主键约束*/
create table user01(
uid int primary key,
uname varchar(10),
address varchar(20) default '北京'
);
insert into user01 values (1,'张春','上海');

再次:insert into user01 values (1,'张春','上海');
报错:

1.6自增长
作用:自动递增
自增长字段可以不赋值,自动递增
例:
/*自增长*/
create table user01(
uid int primary key auto_increment,
uname varchar(10),
address varchar(20) default '北京'
);
执行三遍:insert into user01(uname) values ('张春');

实际企业中很少用自增长,一般用一个随机长字符串(例如:时间戳)当做主键
1.6.2零填充
例:
create table user01(
uid int(4) zerofill primary key auto_increment,
uname varchar(10),
address varchar(20) default '北京'
);
执行三遍:insert into user01(uname) values ('张春');

1.7 外键
作用:约束两种表的数据
出现两种表的情况:
解决数据冗余高问题:独立出一张表
例:
/*员工表*/
create table emp(
eid int primary key auto_increment,
ename varchar(10),
deptid int
);
insert into emp(ename,deptid) values('张三',1);
insert into emp(ename,deptid) values('李四',2);
select * from emp;

/*部门表*/
create table dept(
id int primary key auto_increment,
dname varchar(15)
);
insert into dept(dname) values('研发部');
insert into dept(dname) values('产品部');
select * from dept;

问题出现:在插入员工表数据的时候,员工表的部门id字段可以随便插入!
解决办法: 在员工表的部门id字段添加一个外键约束
语法:
constraint emlyee_dept_fk foreign key(deptid) references dept(id)
-- 外键名称 外键 参考表(参考字段)
外键名称通用规则:所在表_主表_fk
注意:
1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!
2)主表的参考字段通用为主键!外键必须是主表的主键
3)添加数据: 先添加主表,再添加副表
4)修改数据: 先修改副表,再修改主表
5)删除数据: 先删除副表,再删除主表
例:
create table dept(
id int primary key auto_increment,
dname varchar(15)
);
create table emp(
eid int primary key auto_increment,
ename varchar(10),
deptid int,
constraint emp_dept_fk foreign key(deptid) references dept(id)
);
创建成功:

/*插入数据*/
insert into dept(dname) values('测试部');
insert into dept(dname) values('市场部');
insert into dept(dname) values('销售部');
select * from dept;
insert into emp(ename,deptid) values('李四',4);
结果报错:

/*修改数据*/
update emp set deptid=1 where eid=2;
update dept set id=5 where id=2;
/*删除数据*/
delete from emp where eid=1;
delete from dept where id=3;
/*全表删除两种方式对比*/
create table test(
id int primary key auto_increment,
tname varchar(10)
);
insert into test(tname) values('小红');
insert into test(tname) values('小兰');
insert into test(tname) values('小绿');
select * from test;

delete from test;
insert into test(tname) values('小红');
insert into test(tname) values('小兰');
insert into test(tname) values('小绿');
select * from test;

truncate table test;
insert into test(tname) values('小红');
insert into test(tname) values('小兰');
insert into test(tname) values('小绿');
select * from test;

表已建好后,再添加外键:
/*创建表后添加约束*/
create table test(
id int primary key auto_increment,
tname varchar(10),
empid int
);
alter table test add constraint test_emp_fk foreign key(empid) references emp(eid);
在企业里很少用外键,但是要在开发文档中体现出来。
sql常用操作(二)数据约束的更多相关文章
- SQL server基础知识(表操作、数据约束、多表链接查询)
SQL server基础知识 一.基础知识 (1).存储结构:数据库->表->数据 (2).管理数据库 增加:create database 数据库名称 删除:drop database ...
- My SQL常用操作汇总
写这篇随笔的目的是我发现了在上一篇关于My SQL的随笔中存在一些不严谨的代码问题,在这里再次简单的总结一下并加以改进,以代码为主. # !每行命令必须以分号(;)结尾 先通过命令行进入数据库客户端 ...
- Python脚本控制的WebDriver 常用操作 <二> 关闭浏览器
下面将模拟一个WebDriver关闭浏览器的操作 测试用例场景 在一个自动化测试脚本运行完毕后,我们很可能会采取关闭浏览器的操作,而关闭浏览器的常用操作有如下两种: close quit close ...
- sql常用操作(一)
sql(structured query language,结构化查询语言)语言:和数据库交互的语言,进行数据库管理的语言. 1.1 sql语句的作用:说白了就是增删改查 管理数据库 管理表 管理数据 ...
- SQL语句汇总(二)——数据修改、数据查询
首先创建一张表如下,创建表的方法在上篇介绍过了,这里就不再赘述. 添加新数据: INSERT INTO <表名> (<列名列表>) VALUES (<值列表>) ...
- SQL Server 操作XML数据
.xml.exist 输入为XQuery表达式,返回0,1或是Null.0表示不存在,1表示存在,Null表示输入为空 .xml.value 输入为XQuery表达式,返回一个SQL Server标量 ...
- Ubuntu 16.04安装、卸载mysql及怎么使用SQL常用操作语句
以前都是在window上操作,连接数据库,最近转Ubuntu系统,故此,记下安装过程 一,安装mysql,Ctrl+Alt+T打开终端,一步步分别输入命令 //安装mysql服务 sudo apt-g ...
- MYSQL基础操作之数据约束与关联查询
一.MYSQL约束 1.默认值约束,当字段没有插入值的时候,mysql自动给该字段分配默认值. 默认值的字段允许为空. 对默认值字段也可以插入null. CREATE TABLE STUDENT( I ...
- SQL 常用操作
今天网龙笔试遇到了几个SQL题,现在顺便就总结一下常用的SQL操作. 内连接:只将符合条件的行显示出来 SELECT s.name,m.mark FROM student s,mark m WHERE ...
随机推荐
- IE botton 点击文字下沉
IE点击文字下沉这个应该是浏览器自带的,只要是用button标签应该都是避免不了的. 如果实在接受不了的话,用一个元素比如div.p等块级元素或者是i.b.s.u.span等行内元素.用样式去模拟bu ...
- OGG 11g Checkpoint 详解
OGG Checkpoint 详解 定位中断的位置,下次启动从中断的位置开始恢复. 1.target 端配置: 2.一条记录对应一个replicat 一. Extract Check ...
- C# Json库 和 xml 序列化反序列化 存在的问题
json 正常情况下不会对私有成员进行序列化和反序列化, 因此在用json做深拷贝时, 就会丢失数据. 解决办法: 声明成公有成员. json在序列化和反序列化时, 如果类中有IComma ...
- 02_mysql卸载和安装
如果只是随便地反安装/uninstall之后,在文件系统或者是注册表里面可能会残留一些东西,这些东西如果不及时清除掉,再装可能会出现问题,你新装的会用不了. #Path to installation ...
- [codeforces274b]Zero Tree(树形dp)
题意:给出一棵树,每个点有权值,每次操作可以对一个联通子集中的点全部加1,或者全部减1,且每次操作必须包含点1,问最少通过多少次操作可以让整棵树每个点的权值变为0. 解题关键:自底向上dp,记录up, ...
- state estimation for robotics-1
概率论是探讨SLAM的一个重要的工具,概率密度函数的概率意义在于它能够描述一个随机变量位于任意区间的概率. p(x<=x<=x+dx)≍p(x).dx(由拉格朗日中值定理)
- js 正则表达式学习笔记
正则表达式正则表达式是由一个字符序列形成的搜索模型 语法new RegExp("[abc]")/[abc]//正则表达式主体/修饰符(可选) 1.修饰符i 忽略大小写g 执行全局匹 ...
- php UTF8 转字节数组,后使用 MD5 计算摘要
Hex.encodeHexString(md5.digest);按 UTF8 转字节数组,后使用 MD5 计算摘要,得到 16 字节数组,使用 Hex 转为长度为 32 的字符串,保持小写 bin2h ...
- hihoweek 137(简单完全背包)
题目链接:http://hihocoder.com/contest/hiho137/problem/1 题意:中文题诶- 思路:各层的成本计算不会有影响,所以我们只要把没一层的成本计算出来在求和就是答 ...
- 剑指Offer的学习笔记(C#篇)-- 斐波那契数列
题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). 一 . 理解概念 斐波那契数列概念:斐波那契数列(Fibonacci sequence), ...