百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

从零开始学MySQL(十)SQL约束进阶

toyiye 2024-06-21 12:36 10 浏览 0 评论

学习目标

  • 掌握主键约束,唯一约束,非空约束的使用方法
  • 了解主键自增和默认值的使用场景

SQL约束进阶

1.主键约束

1.1主键定义

我们在之前创建表的时候使用了PRUMAEY KEY 这个约束,这个关键字代表的是主键约束,那么,什么是主键约束呢?

  • PRIMARY KEY 约束唯一标识数据库表中的每条记录。
  • 主键必须包含唯一的值。
  • 主键列不能包含 NULL 值。
  • 每个表都应该有一个主键,并且每个表只能有一个主键。

1.2遵循原则

当然为了,我们的存储逻辑清晰准确,定义主键时也应遵循如下原则:

  • 主键应当是对用户没有意义的。
  • 永远也不要更新主键。
  • 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
  • 主键应当由计算机自动生成。

1.3 添加主键约束

创建表时添加

创建表时,在字段描述处,声明指指定字段为主键:

# 添加主键
# 在创建数据表时添加
CREATE TABLE person(
    id INT PRIMARY KEY,
    last_name VARCHAR(100),
    first_name VARCHAR(100),
    address VARCHAR(100),
    city VARCHAR(100)
);

# 查看表结构
DESC person;

表创建完成后,使用DESC进行表结构查看,结果如下:

id这一行,在Key字段所对应的值为PRI,证明主键约束已经添加成功。

创建表后添加

当然,我们也可以在表创建完成后添加主键约束,添加方式如下:

# 在创建后添加约束(了解)
CREATE TABLE person1(
    id INT,
    last_name VARCHAR(100),
    first_name VARCHAR(100),
    address VARCHAR(100),
    city VARCHAR(100)
);

# 创建表后,使用ALTER TABLE关键字添加主键
ALTER TABLE person1 ADD PRIMARY KEY (id);

# 查看表结构
DESC person1;

表创建完成后,使用DESC进行表结构查看,结果如下:

?

此时,主键约束以经添加完成。

1.4删除主键约束

如需撤销 PRIMARY KEY 约束,请使用下面的 SQL:

# 删除主键约束
# 格式:alter table 表名 drop primary key;
ALTER TABLE person1 DROP PRIMARY KEY ;
# 查看表结构
DESC person1;

?

注意:删除主键约束后,虽然该字段不是主键了,但是依旧有非空约束,不能为空。

1.5主键约束字段是非空且唯一的

验证非空:

我们在person表中插入指定数据,sql语句如下:

INSERT INTO person(last_name, first_name, address, city) VALUES('fang','xiao','石景山', '北京');

此时会提示错误信息:Field 'id' doesn't have a default value

由此我们可以得知:==没有默认值的情况下,主键约束字段不能不传值==。

不传值肯定是不行的,那我们可不可以传递一个NULL值呢?我们来试一下:

INSERT INTO person VALUES(1, 'fang', 'xiao', '石景山', '北京');

此时会提示错误信息:Column 'id' cannot be null

由此我们可以得知:==主键约束字段,不能传空值(null)==。

唯一验证

我们在person表中插入指定数据,sql语句如下:

INSERT INTO person VALUES(1, 'fang', 'xiao', '石景山', '北京');

此时没有任何问题,可以正常插入成功。

接下来我们执行下方的sql语句:

INSERT INTO person VALUES(1, 'hong', 'zhang', '浦东', '上海');

1.6自动增长

我们通常希望在每次插入新记录时,数据库自动生成字段的值。

我们可以在表中使用AUTO_INCREMENT(自动增长列)关键字,==自动增长列类型必须是整型,自动增长列必须为键(一般是主键)==。

下列 SQL 语句把 "person" 表中的 "Id" 列定义为 AUTO_INCREMENT主键

# 在创建表时添加自动增长
CREATE TABLE person2(
    id INT PRIMARY KEY AUTO_INCREMENT,
    last_name VARCHAR(255),
    first_name VARCHAR(255),
    address VARCHAR(255),
    city VARCHAR(255)
);

# 查看表结构
DESC person2;

表创建完成后,我们可以使用DESC进行表结构查看,此时我们发现自动增长已经添加成功。

?

扩展:当然,我们也可以在创建表之后添加自动增长。

# 在创建表之后添加自动增长(了解)
ALTER TABLE person2 CHANGE id id INT AUTO_INCREMENT;

我们已经给主键添加了自动增长,那怎样才能使用他呢?

向persons添加数据时,可以==不为Id字段设置值==,==也可以设置成null或0==,数据库将自动维护主键值:

# 不给id 传值
INSERT INTO person2(last_name, first_name, address, city) VALUES('ming', 'xiao', '昌平', '北京');

# 给id 传null值,或0值
INSERT INTO person2 VALUES(null, 'fang', 'xiao', '石景山', '北京');
INSERT INTO person2 VALUES(0, 'fang', 'xiao', '石景山', '北京');

执行结术后,我们查看表中数据,id值已经自增。

?

当然,==如果给id传值,则使用被传入的值写入。==

例如:

# 插入一条id值为9的记录,查看主键自增情况
INSERT INTO person2 VALUES(9, 'fang', 'xiao', '石景山', '北京');

?

如果id为9的记录已经插入,那么,下一次主键自增后的值是多少呢??

其实,自动增长,是在我们当前自增列的最大值的基础上进行+1操作。

例如:

# 自动增长,是在我们当前自增列的最大值的基础上进行+1操作
INSERT INTO person2 VALUES(null, 'fang', 'xiao', '石景山', '北京');

?

2.非空约束

2.1非空约束介绍

==NOT NULL约束强制列不接受 NULL 值==。

==NOT NULL 约束强制字段始终包含值==。这意味着,如果不向字段添加值,就无法插入新记录或者更新记录。

2.2添加非空约束

下面的 SQL 语句强制 "id" 列和 "last_name" 列不接受 NULL 值:

# 非空约束 not null
# 创建表时添加非空约束
CREATE TABLE person3(
    id INT PRIMARY KEY,
    last_name VARCHAR(100) NOT NULL,
    first_name VARCHAR(100) NOT NULL,
    address VARCHAR(100),
    city VARCHAR(100)
);

# 查看表结构
DESC person3;

表创建完成后,查看表结构如下:

?

2.3非空约束验证

非空约束修饰的字段可不可以不传值呢?? 我们来试一下:

INSERT INTO person4(id, first_name, address, city) VALUES(1, 'xiao','昌平', '北京');

此时,将会出现报错信息:Column 'last_name' cannot be null

所以我们得出结论:==非空约束字段,在插入或更新记录时不可以不传值。==

非空约束修饰的字段可不可以传空值呢?我们也来试一下:

INSERT INTO person3 VALUES(1, NULL, 'xiao','昌平', '北京');

此时,将会出现报错信息:Field 'last_name' doesn't have a default value

所以我们得出结论:==非空约束字段,在插入或更新记录时不可以传NULL值。==

3.唯一约束

3.1唯一约束介绍

==UNIQUE 约束唯一标识数据库表中的每条记录。==

UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。

PRIMARY KEY 拥有自动定义的 UNIQUE 约束。

3.2添加唯一约束

下面的 SQL 语句强制 "last_ame" 列不接受 重复值:

# 唯一约束
# 在创建表时添加唯一约束
CREATE TABLE person4(
    id INT PRIMARY KEY,
    last_name VARCHAR(100) UNIQUE ,
    first_name VARCHAR(100),
    address VARCHAR(100),
    city VARCHAR(100)
);

# 查看表结构
DESC person4;

表创建完成后,查看表结构如下:

?


请注意:

==每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。==

3.3唯一约束验证

我们先在person4表中插入一条记录,其中lastname字段的值为“ming”:

INSERT INTO person5 VALUES(1, 'ming', 'xiao', '昌平', '北京');

此时可以插入成功,如果我们再插入一条数据,其中last_name字段的值还是"ming":

# 如果出现插入重复值的情况,将会报错,插入失败
INSERT INTO person5 VALUES(2, 'ming', 'da', '丰台', '北京');

此时,将会出现报错信息:Duplicate entry 'ming' for key 'last_name'

结论:==使用唯一约束修饰的字段中所插入的数据值不能重复。==

4.默认值

4.1默认值介绍

默认 DEFAULT: 当不填写字段对应的值会使用默认值,如果填写时以填写为准。

4.2默认值添加

可以在创建表时添加默认值,当不填写表中字段时将会自动填写默认值。

# 默认值
# 在创建表时添加默认值
CREATE TABLE person5(
    id INT PRIMARY KEY,
    last_name VARCHAR(100),
    first_name VARCHAR(100),
    address VARCHAR(100),
    city VARCHAR(100) DEFAULT '北京'
);

# 查看表结构
DESC person5;

表创建完成后,查看表结构如下:

?

4.3默认值验证

我们在person5表中插入一条记录,此纪录不执行city字段的值,SQL语句如下:

INSERT INTO person5(ID, LAST_NAME, FIRST_NAME, ADDRESS) VALUES (1, 'ming', 'xiao', '昌平');

此时来到表中查看数据,虽然我们没有给city字段传值,但是city字段存在默认值,所以将默认值填写到表中:


结论:==如果插入数据时不指定当前字段的值,则查询该字段是否有默认值,如果有则插入默认值。==

5.小结

  • 主键约束(PRUMAEY KEY ):唯一标示,不能重复,不能为空。
  • 主键应当是对用户没有意义的
  • 永远也不要更新主键。
  • 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。
  • 主键应当由计算机自动生成。


  • 自动增长( auto_increment): 我们可以在表中使用 auto_increment(自动增长列)关键字,自动增长列类型必须是整型,自动增长列必须为键(一般是主键)。
  • 非空约束(NOT NULL):
  • NOT NULL 约束强制列不接受 NULL 值。


  • 唯一约束(UNIQUE):
  • UNIQUE 约束唯一标识数据库表中的每条记录。
  • UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
  • PRIMARY KEY 拥有自动定义的 UNIQUE 约束。


  • 默认值(DEFAULT):
  • 如果插入数据时不指定当前字段的值,则查询该字段是否有默认值,如果有则插入默认值。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码