大家好,今天来为大家解答从零开始学习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(自动增长列)关键字,==自动增长列类型必须是整数,自动增长列必须是键(通常是主键)==。
以下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.唯一约束
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 值。
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/120137.html
用户评论
泪湿青衫
表约束知识总结得太全面了!我以前还不太明白这些约束怎么用,看了你的讲解豁然开朗。尤其是 UNIQUE 和 FOREIGN KEY 的运用,受益 immensely!
有14位网友表示赞同!
灼痛
这个系列做得很棒啊,循序渐进的讲解,从零基础也能慢慢跟上。虽然我也已经学过一些 SQL 知识了,但是学习这些进阶约束还是很有收获!
有11位网友表示赞同!
拽年很骚
我尝试在本地搭建实验环境,跟着文章来实践,感觉确实掌握效果更好!之前看视频理解也比较模糊,现在动手操练才真正知道MySQL的强大之处!
有18位网友表示赞同!
有你,很幸福
我也是零基础小白,跟着这篇文章学MySQL还挺顺利的!不过,我遇到了一些问题,比如怎么判断约束类型、修改约束条件时需要注意哪些点,可以详细解释一下吗?
有11位网友表示赞同!
不浪漫罪名
我觉得 FOREIGN KEY 的例子有点抽象,可以再举一些实际应用场景吗?这样更容易理解这个约束的作用在哪儿
有17位网友表示赞同!
琴断朱弦
说的太对了!在数据库设计的时候,约束的重要性真是不可小觑,它保证了数据的完整性和一致性。以前我忽略了一些细节,导致数据出问题,现在明白了教训。
有14位网友表示赞同!
放血
学习完这篇文章,我决定深入学习一下 MySQL 的事务特性,感觉掌握这些内容后能更好地维护数据库!
有10位网友表示赞同!
浅嫣婉语
虽然文章讲解很详细,但是对于一些基础概念没有过多解释,建议可以加些浅显的理解,方便新手入门。
有9位网友表示赞同!
oО清风挽发oО
这个帖子太棒了!我已经开始学习 MySQL,希望能够尽早掌握这些知识。感谢作者分享这么宝贵的经验!
有8位网友表示赞同!
请在乎我1秒
我之前也学过 SQL 约束的概念,但你的讲解更加深入,特别喜欢你对每种约束的示例和应用场景分析。太牛了!
有18位网友表示赞同!
无所谓
我还在学习数据库设计阶段,这篇文章正好填补了我的知识空白!学习完之后,我更有信心去建立更强大的数据库系统!
有8位网友表示赞同!
何年何念
你的文章真是太好了!很清晰、易懂,而且内容很全面。我学习 MySQL 的进步很大程度上要感谢你!加油吧!
有19位网友表示赞同!
一个人的荒凉
其实这些约束概念并不复杂,但应用起来却需要注意很多细节。你把所有要点都总结得很清楚了,阅读完之后感觉很有收获。
有13位网友表示赞同!
淡抹烟熏妆丶
我觉得这个系列教程很棒,能让我在动手实践的同时学习到理论知识,非常实用!
有10位网友表示赞同!
不忘初心
我目前还在使用其他开源数据库,以后有机会也会来尝试 MySQL,希望能够像你的文章一样系统地学习它!
有13位网友表示赞同!
话少情在
如果把这些约束运用在 Web 应用开发中会有什么影响呢? 我好奇一下你未来的博客内容会不会涉及到具体应用场景?
有17位网友表示赞同!
半世晨晓。
我觉得 UNIQUE 约束的例子不够生动形象,能不能用更通俗易懂的方式来解释?比如,像数据库建表时不能重复填写“用户名”这样例子
有15位网友表示赞同!
权诈
我对这些约束学习已经有了一定了解,但还是希望能看到更多实例和比较深入的分析。希望作者能继续更新更多高质量的内容!
有15位网友表示赞同!