Mysql字段修饰符(约束)
(1).null和not null
not null不可以插入null,但可以插入空值。
数值型、字符型、日期型都可以插入null,但只有字符型可以插入空值。
使用方法如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | mysql> create database test_db; Query OK, 1 row affected (0.00 sec) mysql> use test_db; Database changed mysql> create table `notnull_table`(name varchar(20) not null ); Query OK, 0 rows affected (0.02 sec) mysql> insert into notnull_table values ( null ); //设置not null的列是不允许插入null的 ERROR 1048 (23000): Column 'name' cannot be null mysql> insert into notnull_table values ( '' ); //但可以插入空值 Query OK, 1 row affected (0.00 sec) mysql> insert into notnull_table values ( 'Jack' ); Query OK, 1 row affected (0.01 sec) |
空值与null的区别:空值不占用空间,但null占用空间(计算1字节)。
not null比null的效率高。这是因为null不是空值,占用空间,所以进行字段比较时,null会参与字段比较,对效率有一部分影响。而且索引不会存储null值,索引的效率会下降很多。
(2).default
defalut,默认值。
1 2 3 4 5 6 7 8 9 10 11 12 13 | mysql> create table default_table(id int not null ,name varchar(20) not null default 'test' ); Query OK, 0 rows affected (0.03 sec) mysql> insert into default_table(id) values(1); Query OK, 1 row affected (0.00 sec) mysql> select * from default_table; +----+------+ | id | name | +----+------+ | 1 | test | +----+------+ 1 row in set (0.00 sec) |
注意:如果字符型字段没有设置default,可以为null时,默认为null;不可以为null时,报错。enum单独处理,默认为第一个元素。时间字段没有default,默认为当前时间。
(3).auto_increment
auto_increment,自动增长,每次自动加1,只能用于数值型。不过用上auto_increment好像就必须为主键,不然mysql会报1075的错误信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 | mysql> create table auto_table(id bigint auto_increment primary key,name varchar(20)); Query OK, 0 rows affected (0.02 sec) mysql> insert into auto_table(name) values( 'name' ); Query OK, 1 row affected (0.00 sec) mysql> select * from auto_table; +----+------+ | id | name | +----+------+ | 1 | name | +----+------+ 1 row in set (0.00 sec) |
(4).扩展:清除表数据,包括auto_increment值
一般情况下,删除表数据会使用delete命令,但是delete是没有办法清除auto_increment值的。如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | mysql> select * from auto_table; +----+------+ | id | name | +----+------+ | 1 | name | +----+------+ 1 row in set (0.00 sec) mysql> delete from auto_table; Query OK, 1 row affected (0.03 sec) mysql> insert into auto_table(name) values( 'name2' ); Query OK, 1 row affected (0.01 sec) mysql> select * from auto_table; +----+-------+ | id | name | +----+-------+ | 2 | name2 | +----+-------+ 1 row in set (0.00 sec) |
这时候就需要使用truncate命令。如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | mysql> select * from auto_table; +----+-------+ | id | name | +----+-------+ | 2 | name2 | +----+-------+ 1 row in set (0.00 sec) mysql> truncate table auto_table; Query OK, 0 rows affected (0.02 sec) mysql> insert into auto_table(name) values( 'name3' ); Query OK, 1 row affected (0.01 sec) mysql> select * from auto_table; +----+-------+ | id | name | +----+-------+ | 1 | name3 | +----+-------+ 1 row in set (0.00 sec) |
注意:truncate会清除表的所有数据。如果只想清除auto_increment值,不要使用该命令。
(5).扩展
其实除了以上几个,还存在检查约束、外键约束、主键约束和唯一约束,而主键约束和唯一约束也是索引。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性