MySQL约束条件(主键-自增-默认值)
一:MySQL约束条件
1.什么是约束条件?
1.约束条件相当于是在字段类型之上添加的额外约束(条件)
2.限制表中的数据,保证添加到数据表中的数据准确和可靠性

二:unsigned(去除正负号)
- unsigned
作用:
使整型范围无正负号
格式:
create table t1(id int unsigned);
三:zerofill(不够位数零填充)
- zerofill
作用:
不够位数使用0填充
格式:
create table t1(id int(8) unsigned zerofill)
insert into t1 values(2222);

四:not null(非空)
- not null
作用:
非空(不能为空)
不使用约束条件测试(id字段为空)
create table t3(id int,name varchar(16));
指定给表内字段name插入数据
insert into t3(name) values('jason');
id : NULL(空)
name : jason

1.使用约束条件(不添加会报错)
限制id字段不能为空
create table t4(id int not null,name varchar(16));
不添加id字段添加(报错)
insert into t4(name) values('jason');
正常添加不报错
insert into t4(name) values('jason');

五:default(默认值)
作用:
默认值(用户给了就用用户的 用户不给就是要默认的)
create table t5(id int,name varchar(16) default '匿名用户');
正常传值
insert into t5(id,name) values(2,'jason');
只给id添加值(name默认传值)
insert into t5(id) values(1);
- 注意:
默认值前面(字段是字符串类型)就给字符串
默认值前面(字段是int类型)就给个int类型(1)

六:unique(唯一数据)
作用:
唯一(保证字段(一个、多个)在整个表中没有重复的数据)
unique分为单列唯一和多列唯一。
1.单列唯一(只能控制单列不能重复)
- 案例:
限制name字段不能有重复数据
create table t6(id int,name varchar(16) unique);
向t6表内添加数据
insert into t6 values(1,'jason'),(2,'jason');

2.联合唯一(多个字段组合之后的结果(不能有重复项)单个单个可以有重复项)
- 案例
create table server(
id int,
host varchar(32) comment 'ip地址',
port varchar(32) comment '端口',
unique(host,port)
);
3.添加数据
insert into server values(1,'127.0.0.1','3306'),(2,'127.0.0.1','3307'),(3,'127.0.0.2',3306);
向server表内添加数据(多个字段组合之后结果重复)
insert into server valuse(4.'127.0.0.1',3306);

4.总结
host与port字段结合不重复可以存储(才不会报错)
七:primary key(主键)
1.primary key(主键)
1.但从约束条件上而言主键相当于not null + unique(非空且唯一)
2.主键的功能目前简单的理解为能够加快数据的查询速度相当于书的目录
3.InnoDB存储引擎规定每张表都必须有且只有一个主键
情况1.表中没有任何的主键和其他约束条件
InnoDB默认会采用一个隐藏字段作为表的主键
情况2.表中没有主键但是有非空且唯一的字段
InnoDB会自动将该字段升级为主键
结论:每张表都必须要有一个id(sid nid uid)字段并且该字段就是主键
2.单列主键(验证是否非空且唯一)
create table t7(
id int primary key,
name varchar(32)
);
3.表内添加数据(验证是否为空且唯一)
insert into t9(name) values('gary'); # 报错
insert into t9 values(1,'gary'),(2,'tom'); # 报错

4.验证 (表中没有主键但是有非空且唯一的字段,InnoDB会自动将该字段升级为主键)
create table t8(
id int,
name varchar(32),
age int not null unique,
phone bigint not null unique,
num int not null unique
);

5.多列主键(联合主键)
create table t9(
id int,
age int,
name varchar(16),
primary key(id,age)
);

八:auto_increment(自增)
1.auto_increment作用
自增(专门配合主键一起使用的 让主键能够自增)
2.创建表(验证自增效果)
由于主键类似于数据的唯一标识 并且主键一般都是数字类型
我们在添加数据的时候不可能记住接下来的序号是多少 太麻烦
create table t10(
id int primary key auto_increment,
name varchar(32)
);
3.向t10表内添加指定name字段的数据(不添加id字段数据)
mysql> insert into t10(name) values('jason'),('tony'),('kevin');

九:主键自增特性
1.自增带来的影响
1.主键的自增是不会收到delete from删除操作的影响
2.如果删除某一个字段的话他还是保持原来的自增顺序依次自增。
- 比如:
当我们删除的是字段id为3的位置,再次添加数据字段id就为4,并不会占用被删除3的位置。
就算我们把表内的数据都删除了,再次添加表内数据,也是以原来的字段顺序保存依次自增。

4.解决主键自增问题(truncate)
truncate
作用:
既可以清空表数据也会重置主键值
使用格式:
truncate 表名称;
MySQL约束条件(主键-自增-默认值)的更多相关文章
- SQL Server2000导出数据时包含主键、字段默认值、描述等信息
时经常用SQL Server2000自带的导出数据向导将数据从一台数据库服务器导出到另一台数据库服务器: 结果数据导出了,但表的主键.字段默认值.描述等信息却未能导出,一直没想出什么方法,今天又尝试了 ...
- mysql联合主键自增、主键最大长度小记
前言 一. 联合主键自增问题 今天上午闲来无事翻看了下数据库分类表的设计,看到这样一幕: 当时我好奇的是怎么cateId自增会存在重复值的问题,然后翻看了下主键是由siteId和cateId组成.所以 ...
- mysql iot 主键自增列问题
mysql 如何避免热点块? 主键按sn自增列 Oracle 可以通过翻转索引 比如 插入101 102 103 104 变成101 201 301 401 分散数据 反转索引坏处,无法index r ...
- mysql——非主键自增
今天遇到一个问题: 要创建一张表,其中我想将ip和date这两列作为一个复合主键,可以通过如下语句修改表结构: alter table tb_name add primary key (字段1,字段2 ...
- mySQL 中主键值自动增加
转 http://stevenjohn.iteye.com/blog/976397 MySql 主键自动增长 博客分类: DataBase MySQLSQL 创建数据库,创建表. mysql> ...
- mysql 设置自增主键id的起始值
修改user表,主键自增从20000开始 alter table user AUTO_INCREMENT=20000;
- mysql设置主键自增长和自增长初始值
本文主要向大家介绍MySQL数据库之Mysql创建表实现主键自增并且初始值为200,希望对大家学习MySQL数据库有所帮助. 假设已经创建表test,并且主键为id.Mysql ...
- com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'portal.hibernate_sequence' doesn't exist, 谈谈主键自增的方式
最近几天几天做项目用到了Spring Data JPA,确实是个好东西,省了很多力气.但是由于刚开始用,也遇到不少头疼的问题,如下,调用JpaRepository接口的save方法保存一个对象到数据库 ...
- mysql数据库单表只有一个主键自增id字段,ibatis实现id自增
mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid"> insert into user_id ...
- 【mybatis】mybatis中insert 主键自增和不自增的插入情况【mysql】
主键不自增:返回值是插入的条数 <insert id="add" parameterType="EStudent"> insert into TSt ...
随机推荐
- win10系统应用商店打开后无法联网 代码: 0x80131500 的解决办法
官方提供的建议网址: https://answers.microsoft.com/zh-hans/windows/forum/all/代码/cbbe7aaf-8f66-4779-89c8-3c74f5 ...
- Fluent插件管理
官方文档地址:https://docs.fluentd.org/deployment/plugin-management 命令fluent-gem是Fluentd用来安装插件的,它是gem命令的包装器 ...
- 手把手教你使用LabVIEW人工智能视觉工具包快速实现图像读取与采集(含源码)
目录 前言 一.工具包位置 二.图像采集与色彩空间转换 1.文件读写 2.实现图片读取 3.使用算子cvtColor实现颜色空间转换 三.从摄像头采集图像 1.Camera类 2.属性节点 3.实现摄 ...
- Leetcode栈&队列
Leetcode栈&队列 232.用栈实现队列 题干: 思路: 栈是FILO,队列是FIFO,所以如果要用栈实现队列,目的就是要栈实现一个FIFO的特性. 具体实现方法可以理解为,准备两个栈, ...
- 220722 T4 求和 /P4587 [FJOI2016]神秘数 (主席树)
好久没打主席树了,都忘了怎么用了...... 假设我们选了一些数能构成[0,x]范围内的所有值,下一个要加的数是k(k<=x+1),那么可以取到[0,x+k]内的所有取值,所以有一种做法: 对于 ...
- .NET周报【10月第1期 2022-10-11】
本周精选 继C#实现await/async无栈协程几年后,davidwrighton实现了.NET绿色线程(有栈协程)的原型 https://github.com/dotnet/runtimelab/ ...
- 一篇文章让你搞懂Java中的静态代理和动态代理
什么是代理模式 代理模式是常用的java设计模式,在Java中我们通常会通过new一个对象再调用其对应的方法来访问我们需要的服务.代理模式则是通过创建代理类(proxy)的方式间接地来访问我们需要的服 ...
- JDK 8之前日期和时间的API
JDK 8之前日期和时间的API(1) System类中的currentTimeMillis():返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差.称为时间戳. java.util ...
- 知识图谱顶会论文(IJCAI-2022) TEMP:多跳推理的类型感知嵌入
IJCAI-TEMP:知识图谱上多跳推理的类型感知嵌入 论文地址: Type-aware Embeddings for Multi-Hop Reasoning over Knowledge Graph ...
- 三十五、kubernetes NameSpace介绍
Kubernetes NameSpace 介绍 Kubernetes使用命名空间的概念帮助解决集群中在管理对象时的复杂性问题.命名空间允许将对象分组到一起,便于将它们作为一个单元进行筛选和控制.无论是 ...