表约束除了空属性,默认值,描述符以及零填充外(空属性,默认值default,列描述comment以及零填充zerofill),还有主键,自增长,唯一键等对字段的索引和扩展约束。

1. 主键

使用 primary key 进行主键的定义。

主键用于唯一的约束该字段里的数据,主键约束的字段不能为空,不能重复,一张表里最多只能有一个主键,但是可以定义复合主键来突破这个限制。

-- 设置name字段为主键

mysql> create table t1(id int primary key, name varchar(32));

Query OK, 0 rows affected (0.28 sec)

mysql> insert into t1 values(1, 'xucc');

Query OK, 1 row affected (0.07 sec)

-- 插入重复主键数据

mysql> insert into t1 values(1, 'licc');

ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

-- 插入空的主键数据

mysql> insert into t1(name) values('licc');

ERROR 1364 (HY000): Field 'id' doesn't have a default value

除了这种定义主键的方式外,还有两种方式。

--方式二,在字段列表之后定义主键

mysql> create table t2(id int, name varchar(32), primary key(id));

Query OK, 0 rows affected (0.24 sec)

mysql> create table t3(id int, name varchar(32));

Query OK, 0 rows affected (0.28 sec)

--方式三,追加主键

mysql> alter table t3 add primary key(id);

Query OK, 0 rows affected (0.52 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc t2;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| id | int(11) | NO | PRI | NULL | |

| name | varchar(32) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

2 rows in set (0.00 sec)

mysql> desc t3;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| id | int(11) | NO | PRI | NULL | |

| name | varchar(32) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

2 rows in set (0.00 sec)

我们可以看到,定义了主键的字段在表结构里Key字段为PRI,表结构Key字段表示的是表的索引,主键是索引的一种。

还可以定义复合主键,方法如下:

mysql> create table t4(id int, name varchar(32), age int, primary key(name, id));

Query OK, 0 rows affected (0.30 sec)

mysql> desc t4;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| id | int(11) | NO | PRI | NULL | |

| name | varchar(32) | NO | PRI | NULL | |

| age | int(11) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

3 rows in set (0.02 sec)

复合主键虽然看起来使多个字段都定义成了主键,但实质上是使用这些字段来共同确定行的唯一性。

使用drop可以删除表中主键。

mysql> alter table t4 drop primary key;

Query OK, 0 rows affected (0.79 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> desc t4;

+-------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| id | int(11) | NO | | NULL | |

| name | varchar(32) | NO | | NULL | |

| age | int(11) | YES | | NULL | |

+-------+-------------+------+-----+---------+-------+

3 rows in set (0.01 sec)

2. 自增长

auto_increment用来定义字段的自增长。

自增长的字段不需要插入值,每次修改自增长所在的表,MySQL会自动将自增长字段加1。

定义自增长的字段必须要是一个索引,例如通常与主键字段搭配使用,所以自增长又称为逻辑主键。

自增长字段必须是整数,且一张表只能有一个自增长字段,,因为自增长与key搭配,目前key学的是主键,主键只有一个,所以自增长也只有一个。

mysql> create table t5(id int primary key auto_increment, name varchar(32));

Query OK, 0 rows affected (0.39 sec)mysql> insert into t5(name) values('zhangsan');

Query OK, 1 row affected (0.07 sec)

mysql> insert into t5(name) values('lisi');

Query OK, 1 row affected (0.06 sec)

mysql> insert into t5(name) values('wangwu');

Query OK, 1 row affected (0.05 sec)

mysql> select * from t5;

+----+----------+

| id | name |

+----+----------+

| 1 | zhangsan |

| 2 | lisi |

| 3 | wangwu |

+----+----------+

3 rows in set (0.00 sec)

自增长只会增长,就算删除了自增长字段的数据,下一次修改表时也会继续从原有值增长。

--删除自增长约束的id字段

mysql> alter table t5 drop id;

Query OK, 3 rows affected (0.68 sec)

Records: 3 Duplicates: 0 Warnings: 0

mysql> select * from t5;

+----------+

| name |

+----------+

| zhangsan |

| lisi |

| wangwu |

+----------+

3 rows in set (0.00 sec)

--添加自增长id字段

mysql> alter table t5 add id int primary key auto_increment;

Query OK, 0 rows affected (0.55 sec)

Records: 0 Duplicates: 0 Warnings: 0--插入一个元素

mysql> insert into t5(name) values('xucc');

Query OK, 1 row affected (0.09 sec)

mysql> select * from t5;

+----------+----+

| name | id |

+----------+----+

| zhangsan | 1 |

| lisi | 2 |

| wangwu | 3 |

| xucc | 4 |

+----------+----+

4 rows in set (0.00 sec)

mysql> desc t5;

+-------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+----------------+

| name | varchar(32) | YES | | NULL | |

| id | int(11) | NO | PRI | NULL | auto_increment |

+-------+-------------+------+-----+---------+----------------+

2 rows in set (0.00 sec)

从表结构中我们可以看出,自增长是Extra扩展字段的一种。

3. 唯一键

唯一键可以解决表中有多个字段需要唯一性约束的问题。

唯一键的本质和主键差不多,唯一键约束的字段允许为空,而且可以多个为空,空字段不做唯一性比较。

唯一键定义方式和主键一样,也有对应的三种方式。

--创建一个拥有唯一键字段的表

mysql> create table t6(num int unique);

Query OK, 0 rows affected (0.39 sec)

mysql> insert into t6 values(1);

Query OK, 1 row affected (0.06 sec)

--插入重复元素

mysql> insert into t6 values(1);

ERROR 1062 (23000): Duplicate entry '1' for key 'num'

--唯一键可以为空

mysql> insert into t6 values(null);

Query OK, 1 row affected (0.08 sec)

mysql> desc t6;

+-------+---------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-------+---------+------+-----+---------+-------+

| num | int(11) | YES | UNI | NULL | |

+-------+---------+------+-----+---------+-------+

1 row in set (0.00 sec)

从表结构中我们可以看出,唯一键也是索引的一种。

mysql从零开始自增id_MySQL从零开始 7-表约束之主键,自增长,唯一键相关推荐

  1. MYSQL学习笔记06:列属性[NULL,default,comment],主键,自增长,唯一键,数据库设计规范[范式(1NF,2NF,3NF),逆规范化],表关系[1V1,1VN,NVN]

    列属性 列属性又称为字段属性. 在mysql中一共有6个属性:null,默认值,列描述,主键,唯一键和自增长. NULL属性 NULL属性代表字段为空. 如果对应的值为yes表示该字段允许为null, ...

  2. mysql中非主键不能自增吗_mysql非主键自增长用法实例分析

    本文实例讲述了mysql非主键自增长用法.分享给大家供大家参考,具体如下: mysql并非只有主键才能自增长,而是设为键的列就可以设置自增长.   如下: CREATE TABLE t1 ( id I ...

  3. mysql主键自增长空缺_Mysql 主键自增长auto_increment问题分析

    本节内容: Mysql 主键自增长 在mysql数据库中,主键由auto_increment实现自增长,若自定义函数来表示auto_increment的话可以如下: 复制代码 代码示例: create ...

  4. mysql主键自增长_全面的MySQL优化面试解析

    本文概要 文章内图片有损,需要高清可以在公众号内回复"大图" 概述 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理 ...

  5. mybatis mysql usegeneratedkeys_mybatis中useGeneratedKeys用法--插入数据库后获取主键值

    前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录 在项目中经常需要获取到插 ...

  6. MySql Workbench如何设置主键自增长

    一直以来使用的MySQL数据库客户端都是Navicat,不得不说Navicat用起来还是很方便的. 可惜它是商业收费软件,因为版权原因,公司禁止使用其PJ软件.要求全部卸载 于是乎,换用了MySQL官 ...

  7. mysql主键约束自动增长_MySQL教程45-MySQL主键自增长

    在 MySQL 中,当主键定义为自增长后,这个主键的值就不再需要用户输入数据了,而由数据库系统根据定义自动赋值.每增加一条记录,主键会自动以相同的步长进行增长. 通过给字段添加 AUTO_INCREM ...

  8. mysql设置主键自动增长

    1.不设置主键的增长起点(默认1开始) create table user(usernc varchar(10) not null,id int not null auto_increment,nam ...

  9. Mysql,SqlServer,Oracle主键自动增长的设置

    Mysql,SqlServer,Oracle主键自动增长的设置 参考文献 http://blog.csdn.net/andyelvis/article/details/2446865 1.把主键定义为 ...

最新文章

  1. 情感分析:基于循环神经网络
  2. Android Drawable 详解(教你画画!)
  3. HTML5 2D平台游戏开发#7Camera
  4. Exchange Server2010系列之十一:部署CAS+HT角色高可用性
  5. mysql中的页与磁盘关系_数据库和磁盘阵列的关系
  6. 每天Leetcode 刷题 初级算法篇-打乱数组
  7. 深度学习之----各种学习策略
  8. mate2 刷机 android8,华为Mate2官方原版固件rom刷机包_华为Mate2系统强刷升级包
  9. 部分选主元的Doolittle分解
  10. elementUI表格无数据显示图片
  11. 全国计算机建模三等奖,青春榜样 | 吴昊 : 守得云开见月明
  12. datasets数据集
  13. 浅谈对JIT编译器的理解。
  14. vue开发项目必备知识
  15. C. Ehab and Path-etic MEXs
  16. 计蒜客习题:帕吉的肉钩
  17. catia打开stp文件不是实体_Catia与Stp格式转换时居然有这么多技巧,你造吗?
  18. 监控摄像头CIF、D1、WD1、HD画质区别
  19. 骨素Paratie Plus 2017 1CD+NERSim v1.09a 1CD集善据
  20. 表情包也能用 AI 生成?如何借助 AIGC 自定义专属表情包 #Memix

热门文章

  1. 取两个数较小值c语言_编程代码:用C语言来实现下雪效果,这个冬天,雪花很美...
  2. 在Linux系统下生产者消费者,生产者-消费者问题实现 (linux下C语言)
  3. 矩阵运算和文本处理中的分类问题
  4. TensorRT学习笔记7 - 保存与读取序列化的结果
  5. 【NOIP2013模拟9.29】TheSwaps
  6. codeblock 带mingw的版本_云顶之弈10.22新版本最强阵容排名 10.22版本吃鸡阵容推荐...
  7. 2019-10-27 控制领域期刊介绍
  8. ThreadLocal的意义和实现
  9. [USACO2009 OPEN] 滑雪课 Ski Lessons
  10. matlab中fprintf函数的具体使用方法