从零开始学习MySQL(十):高级SQL约束

学习目标掌握主键约束,唯一约束,非空约束的使用方法了解主键自增和默认值的使用场景SQL约束进阶1.主键约束1.1主键定义我们在之前创建表的时候使用了PRUMAE

大家好,今天来为大家解答从零开始学习MySQL(十):高级SQL约束这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

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

1.2遵循原则

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

主键对于用户来说应该是没有意义的。切勿更新主键。主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。主键应由计算机自动生成。

1.3 添加主键约束

创建表时添加

id行中Key字段对应的值为PRI,证明主键约束添加成功。

创建表后添加

当然,我们也可以在建表后添加主键约束。添加方法如下:

# 创建后添加约束(理解) CREATE TABLE person1( id INT, last_name VARCHAR(100), first_name VARCHAR(100), address VARCHAR(100), city VARCHAR(100)); # 创建表后,使用ALTER TABLE key ALTER TABLE person1 ADD PRIMARY KEY (id);# 查看表结构DESC person1;表创建完成后,使用DESC查看表结构。结果如下:

至此,主键约束就添加完毕了。

1.4删除主键约束

要撤销PRIMARY KEY 约束,请使用以下SQL:

# 删除主键约束# 格式: alter table 表名drop 主键;更改表person1 删除主键; # 查看表结构DESC person1;

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

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

验证非空:

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

INSERT INTO person(姓氏, 名字, 地址, 城市) VALUES(‘fang’,’xiao’,’石景山’, ‘北京’);此时会提示错误信息:Field ‘id’ does not have a default value。

由此我们可以知道:当==没有默认值时,主键约束字段一定不能传递值==。

不传值肯定不行,那么我们可以传NULL值吗?让我们尝试一下:

INSERT INTO person VALUES(1, ‘fang’, ‘xiao’, ‘石景山’, ‘北京’);此时会提示错误信息:Column ‘id’不能为空。

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

唯一验证

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

INSERT INTO person VALUES(1, ‘fang’, ‘xiao’, ‘石景山’, ‘北京’);此时就没有问题了,可以插入成功。

接下来我们执行如下sql语句:

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

1.6自动增长

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

我们可以在表中使用AUTO_INCRMENT(自动增长列)关键字,==自动增长列类型必须是整数,自动增长列必须是键(通常是主键)==。

从零开始学习MySQL(十):高级SQL约束

以下SQL 语句将“person”表中的“Id”列定义为AUTO_INCRMENT 主键

# 创建表时添加自动增长CREATE TABLE person2( id INT PRIMARY KEY AUTO_INCRMENT, 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_INCRMENT;我们为主键添加了自动增长,那么如何使用呢?

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

# 不向id 传递任何值INSERT INTO person2(last_name, first_name, address, city) VALUES(‘ming’, ‘xiao’, ‘Changping’, ‘Beijing’); # 将空值或0值传递给id 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’, ‘Shijingshan’, ‘Beijing’);

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, 名字, 地址, 城市) VALUES(1, ‘xiao’,’昌平’, ‘北京’);这时会出现错误信息:Column ‘last_name’不能为空。

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

可以将空值传递给由非空约束修改的字段吗?我们也来尝试一下:

INSERT INTO person3 VALUES(1, NULL, ‘xiao’,’昌平’, ‘北京’);这时会出现错误信息:Field ‘last_name’没有默认值。

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

3.唯一约束

从零开始学习MySQL(十):高级SQL约束

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 人4;表创建完成后,查看表结构如下:

请注意:

==每个表可以有多个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’, ‘Fengtai’, ‘Beijing’);这时会出现错误信息: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 值。

用户评论

从零开始学习MySQL(十):高级SQL约束
泪湿青衫

表约束知识总结得太全面了!我以前还不太明白这些约束怎么用,看了你的讲解豁然开朗。尤其是 UNIQUE 和 FOREIGN KEY 的运用,受益 immensely!

    有14位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
灼痛

这个系列做得很棒啊,循序渐进的讲解,从零基础也能慢慢跟上。虽然我也已经学过一些 SQL 知识了,但是学习这些进阶约束还是很有收获!

    有11位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
拽年很骚

我尝试在本地搭建实验环境,跟着文章来实践,感觉确实掌握效果更好!之前看视频理解也比较模糊,现在动手操练才真正知道MySQL的强大之处!

    有18位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
有你,很幸福

我也是零基础小白,跟着这篇文章学MySQL还挺顺利的!不过,我遇到了一些问题,比如怎么判断约束类型、修改约束条件时需要注意哪些点,可以详细解释一下吗?

    有11位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
不浪漫罪名

我觉得 FOREIGN KEY 的例子有点抽象,可以再举一些实际应用场景吗?这样更容易理解这个约束的作用在哪儿

    有17位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
琴断朱弦

说的太对了!在数据库设计的时候,约束的重要性真是不可小觑,它保证了数据的完整性和一致性。以前我忽略了一些细节,导致数据出问题,现在明白了教训。

    有14位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
放血

学习完这篇文章,我决定深入学习一下 MySQL 的事务特性,感觉掌握这些内容后能更好地维护数据库!

    有10位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
浅嫣婉语

虽然文章讲解很详细,但是对于一些基础概念没有过多解释,建议可以加些浅显的理解,方便新手入门。

    有9位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
oО清风挽发oО

这个帖子太棒了!我已经开始学习 MySQL,希望能够尽早掌握这些知识。感谢作者分享这么宝贵的经验!

    有8位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
请在乎我1秒

我之前也学过 SQL 约束的概念,但你的讲解更加深入,特别喜欢你对每种约束的示例和应用场景分析。太牛了!

    有18位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
无所谓

我还在学习数据库设计阶段,这篇文章正好填补了我的知识空白!学习完之后,我更有信心去建立更强大的数据库系统!

    有8位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
何年何念

你的文章真是太好了!很清晰、易懂,而且内容很全面。我学习 MySQL 的进步很大程度上要感谢你!加油吧!

    有19位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
一个人的荒凉

其实这些约束概念并不复杂,但应用起来却需要注意很多细节。你把所有要点都总结得很清楚了,阅读完之后感觉很有收获。

    有13位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
淡抹烟熏妆丶

我觉得这个系列教程很棒,能让我在动手实践的同时学习到理论知识,非常实用!

    有10位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
不忘初心

我目前还在使用其他开源数据库,以后有机会也会来尝试 MySQL,希望能够像你的文章一样系统地学习它!

    有13位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
话少情在

如果把这些约束运用在 Web 应用开发中会有什么影响呢? 我好奇一下你未来的博客内容会不会涉及到具体应用场景?

    有17位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
半世晨晓。

我觉得 UNIQUE 约束的例子不够生动形象,能不能用更通俗易懂的方式来解释?比如,像数据库建表时不能重复填写“用户名”这样例子

    有15位网友表示赞同!

从零开始学习MySQL(十):高级SQL约束
权诈

我对这些约束学习已经有了一定了解,但还是希望能看到更多实例和比较深入的分析。希望作者能继续更新更多高质量的内容!

    有15位网友表示赞同!

原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/120137.html

(0)
小su's avatar小su
上一篇 2024年9月1日 下午12:36
下一篇 2024年9月1日 下午12:50

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注