2025年mysql中主键约束(mysql增加主键约束)

mysql中主键约束(mysql增加主键约束)约束用于确保数据库的数据满足特定的商业规则 MySQL 中的常见约束有 NOT NULL 非空 PRIMARY KEY 主键 FOREIGN KEY 外键 UNIQUE 唯一 和 CHECK 检查 五种 其中 由于 NOT NULL 我们在之前的博文中已经用过很多次了 所以 up 此处只演示其余四种 主键用于唯一的标示表中的数据 当对表中某个字段定义主键约束后

大家好,我是讯享网,很高兴认识大家。



        约束用于确保数据库的数据满足特定的商业规则。MySQL中的常见约束有NOT NULL(非空), PRIMARY KEY(主键), FOREIGN KEY(外键), UNIQUE(唯一)CHECK(检查)五种。其中,由于NOT NULL我们在之前的博文中已经用过很多次了,所以up此处只演示其余四种。

        主键用于唯一的标示表中的数据,当对表中某个字段定义主键约束后,该列的数据不允许重复。在实际开发中,一般情况下每个表都会定义一个主键约束。

        方式一 :        

        字段名  字段类型  PRIMARY KEY

        方式二 : 

        PRIMARY KEY(字段名)

        注意事项——
        定义主键约束的字段不允许重复,且不允许为空。

        一张表最多只能有一个主键,但可以定义一个复合主键,格式为在定义表的字段的最后,加上一行“PRIMARY KEY(column_1, column_2…)”,定义复合主键后,要求在向表中添加数据时,复合主键约束的那几个字段不能完全相同,即允许有不完全相同。(后面我们会进行代码演示)

        使用DESC table_name可以快速查看表的主键。

        定义自增长是为了使表中的某个整型字段(eg : id)能够从1开始自动的增长

        定义格式如下 : 

        字段名 整型 PRIMARY KEY AUTO_INCREMENT

        使用格式如下 : 

        INSERT INTO table_name(column1,column2…) VALUES(NULL, val2…);
        INSERT INTO table_name(column2,column3…) VALUES(val2,val3…);

        INSERT INTO table_name VALUES(NULL, val2…);

        PS :

        1>传入NULL给定义了自增长的字段,实际会自动将1,2,3,4…..传给该字段。
       

2>一般地,自增长都会和PRIMARY KEY 一起配合使用,但也可以单独使用(单独使用时需要UNIQUE约束的配合)。

        3>一般地,自增长修饰的字段均为整型;实际浮点型也可以,但是使用频率非常低。

        4>自增长默认从1开始,可以通过ALTER TABLE table_name AUTO_INCREMENT = ___; 语句来修改。

        5>若向自增长修饰的字段传入了一个指定值,则以指定值为准进行自增长。并且,一般地,若程序员手动指定了自增长的默认值,就按照指定后自增长的规则来添加数据。(要专一)

                先来创建一张水果表,并定义水果编号字段fno为主键代码如下 : 


讯享网

                尝试向水果表中添加 “fno = 2,但fname和fswe均与表中已存在的fno = 2的记录不同” 的数据,如下 : 

                这时Navicat会报错,提示主键不允许重复,如下图所示 : 

                继续,尝试向水果表中添加fno = 4,但fname和fswe均与表中已存在记录相同的数据,如下 : 

                继续,尝试向水果表中添加fno = NULL的数据,如下 : 

                可以看到fno字段做了PRI(主键)的标记。 

                定义一个新的水果表fruit_2,并为其字段fno和fname设置复合主键约束代码如下 : 

                尝试向fruit_2水果表中添加fno = 3,fname = ‘grape_2’的数据,如下 : 

                尝试向水果表fruit_2中添加fno = 3, fname = ‘grape’, fcolor = ‘blue’的数据,如下 : 

                先来建一张学生表,指定id为主键并且设置自增长代码如下 : 

                向学生表中添加数据,代码如下 : 

        当某个字段定义了UNIQUE约束后,表示该列数据的值是唯一的,不能重复。

        字段名 字段类型 UNIQUE

        注意事项——

        对于UNIQUE约束的字段,若没有定义NOT NULL约束,则该字段是允许有多个NULL的。(即NULL允许重复)

        一张表可以有多个UNIQUE约束的字段。

        仍然可以在DESC显示出的表结构中,查看表中约束条件的情况。

                先来建一张水果表fruit_3,玩儿得花一点,对表中所有字段都添加UNIQUE约束,代码如下 : 

                尝试向表中添加fno = 4,fname = ‘pear’, fswe = 11, fcol = NULL的数据,如下 : 

                可见,单独定义UNIQUE字段是允许有多个NULL存在的
                同样,可以使用DESC查看fruit_3表的结构,如下图所示 : 

                可以看到,同时定义了UNIQUE约束与NOT NULL约束的字段,就相当于一个主键约束的字段。 

        外键用于定义主表和从表之间的关系。外键约束要定义在从表上主表则必须具有PRIMARY KEY约束或UNIQUE约束

        当从表中的字段定义了外键约束后,要求该字段的数据必须在主表的主键列存在或者为NULL(注意此处指的是从表中的数据为NULL,且前提是主表对应的字段在定义时允许为NULL),否则无法向从表中添加数据;并且,如果想删除主表主键列的某条数据,必须要求从表中没有相应的数据与之关联,即在外键约束下,数据无法任意删除

        FOREIGN KEY (从表字段名) REFERENCES 主表名(主键名或UNIQUE字段名)
        注意事项——
       




外键关系要在创建表时单独定义,类似于单独定义主键的方式,写在字段的最后。

        INNODB类型的表才支持外键

        外键约束的字段类型要和对应主键的字段类型一致(长度可以不同)

        若一张从表中要定义多个外键(即与多张主表发生关联), 则不同的外键要单独定义。

                建立如下的主表与从表关系 : (主表为班级表classes,从表为学生表stus)

                代码如下 : 

                尝试向从表中添加“s_classId字段在主表中对应的c_id不存在”的数据(也就是说两个班级编号对不上),如下 : 

                显然不成功,因为主表中并不存在c_id = 50, 75或140的记录。将s_classId改为在主表中c_id字段存在的值,再次尝试添加,如下 : 

                尝试删除主表中的某条记录,由于此时在从表中定义了外键约束,并且已经有相关记录与之关联,所以一定会删除失败,如下 : 

                先删除从表中与主表主键字段的某个数据相关联的全部记录,便可以删除主表中主键对应数据的记录。如下 : 

        CHECK用于强制限制行数据(记录)必须满足的条件若某个字段使用CHECK约束进行了修饰,那么向表中添加记录时,要求这一具体的字段必须满足CHECK约束的条件,否则报错
        PS : 

        Oracle 和 SQL Server均支持CHECK,MySQL8.0开始也支持CHECK(MySQL5.7版本仅支持CHECK的语法校验,但并不会实际生效)。

        字段名 字段类型 CHECK(check_expression)

        注意事项——
       

在MySQL中实现CHECK的功能,一般是在程序中控制,或者通过触发器来完成。

                先来建一张水果表,要求水果名必须带grape,并且要求水果的甜度必须大于等于10。代码如下 : 

                尝试向表中添加不符合CHECK约束的记录,如下 : 

                Navicat会报错,提示不满足CHECK约束条件,如下 :  

                将其修改为复合CHECK约束条件的记录,并再次尝试添加,如下 : 

        System.out.println(“END——————————————————————————”);

小讯
上一篇 2025-05-12 11:37
下一篇 2025-05-04 18:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/208295.html