• MySQL约束详解


            如何理解约束:如果把身份证号码作为数据存入数据库中,万一出现了19位的身份证号该怎么办?有两个人的身份证号居然是相同的这可能吗?

            MySQL中的约束就是用来检测数据正确性和合理性的,一般的错误有:1,存在相同重复的数据;2,错误的数据;3,数据丢失错误(空数据);4,指代不明确的错误(表之间无法准确联系起来)等。

            MySQL的约束就是用来解决上述问题的。

            约束可以看成是一个具体表对象的属性。

            约束是对表对象进行的操作。

    目录

    一,什么是约束?

    1,主键约束

    2,外键约束

    3,唯一性约束

    4,非空约束

    5,检查约束

    6,注意点

    二,操作表的约束

    1,给表添加主键约束

    2,给表添加主键自增长

    3,删除表中的主键

    4,给一张表添加外键约束

    5,给表删除外键

    6,给表添加唯一性约束

    7,给表中某字段删除唯一性约束

    8,被表中某个字段添加非空约束

    9,删除表中某个字段的非空约束

    三,创建表的时候添加约束

    1,查询表中加了哪些约束?

    2,创建表时添加约束


    一,什么是约束?

            数据库约束是对表中的数据进行进一步的限制,保证数据的正确性、有效性和完整性。
            约束限制的内容大概为:唯一性,能否为空,外键是否明确。

    1,主键约束

            prime key,主键约束是使用最频繁的约束。在设计数据表时,一般情况下,都会要求表中设置一个主键。 主键是表的一个特殊字段,该字段能唯一标识该表中的每条信息。例如,学生信息表中的学号必须是唯一不重复的,则可以为这个字段加上主键约束。

            总结:主键是一个表的特殊字段,具有现实意义的唯一性。即:可以选择某个字段作为主键,但是这个字段的数据必须是唯一不空的。或者使用自增长主键。

            特点:唯一性,不能空,不重复(都唯一了,哪来的重复)。记忆口诀:唯一的身份证。

    2,外键约束

            (Foreign Key) ,外键约束经常和主键约束一起使用,用来确保数据的一致性。比如成绩表和学生信息表之间需要产生联系,可以通过学生学号。

            特点:可空,可重复,完整性。可空是因为空可以代表一种状态,可重复是指他们的状态相同,完整性是指不允许查不到。

            总结:新增或确定某一个字段作为外键。通过这一个字段的能够与其他表进行联系。如果他有值,则这个值必须在其他表某个字段里面存在。外键是给程序员看的,本表→本表外键→其他表字段→得到其他表整行数据。

    3,唯一性约束

            (Unique) ,唯一约束与主键约束有一个相似的地方,就是它们都能够确保列的唯一性。与主键约束不同的是,唯一约束在一个表中可以有多个(为多个字段设置唯一性约束),并且设置唯一约束的列是允许有空值的。

            特点:某字段设置唯一性约束之后,可以为空(多个空也行),当有值时则值必须唯一。

    4,非空约束

            (Not Null) ,非空约束用来约束表中的字段不能为空。他作为的是字段的属性。

    5,检查约束

            (Check) ,检查约束也叫用户自定义约束,是用来检查数据表中,字段值是否有效的一个手段,但目前 MySQL 数据库不支持检查约束

    6,注意点

            主键约束=唯一性约束+非空约束。

    二,操作表的约束

    1,给表添加主键约束

            单一主键:使用一个列作为主键列,当该列的值有重复时,则违反唯一约束。
            联合主键:使用多个列作为主键列,当多个列的值都相同时,则违反唯一约束。指的是:使用多个列的组合形式来确定主键,当出现组合重复就无效。

            使用DDL语句添加主键约束。示例:

    1. ALTER TABLE 表名 ADD PRIMARY KEY(列名)
    2. alter table emp add primary key(employee_id);
    3. alter table emp add primary key(employee_id,shenfen_id);//联合主键

    2,给表添加主键自增长

            auto_increment。当程序员没有添加主键约束时,数据库管理系统自动维护表时自动加上的主键,利用自然数自增的方式确定主键。

           1, 一个表中只能有一个列为自动增长。2,自动增长的列的类型必须是整数类型。3,自动增长只能添加到具备主键约束唯一性约束的列上。4,删除主键约束或唯一性约束,如果该列拥有自动增长能力,则需要先去掉自动增长然后在删除约束。

            注意点:如果之前给某个字段添加了自增长属性,则删除这个字段时要先删除自增长属性。

    1. alter table 表名 modify 主键 类型 auto_increment;
    2. alter table emp modify employee_id int auto_increment;

            或者在Navicat中添加主键:

    3,删除表中的主键

            使用DDL语句删除主键。

    1. ALTER TABLE 表名 DROP PRIMARY KEY;
    2. alter table emp drop primary key;

            注意:删除主键时,如果主键列具备自动增长能力,需要先去掉自动增长,然后在删除主键。

    1. alter table emp modify employee_id int;
    2. alter table emp drop primary key;

    4,给一张表添加外键约束

            使用DDL语句添加外键约束。

    1. ALTER  TABLE 表名 ADD CONSTRAINT 约束名 FOREIGN  KEY(列名) REFERENCES 参照的表名(参照的列名);
    2. alter table emp add constraint emp_fk
    3. foreign key(dept_id) references
    4. departments(department_id);

            或在在Navicat中添加外键。外键名称常使用:表名_fk,表名_fk1表示。

    5,给表删除外键

            使用DDL 语句删除外键约束。或者在Navicat中主动删除外键。
    1. ALTER TABLE 表名 DROP FOREIGN KEY 约束名;
    2. alter table emp drop foreign key emp_fk;

    6,给表添加唯一性约束

            使用DDL语句添加唯一性约束。或在在Navicat中添加唯一性约束。

    1. ALTER TABLE 表名 ADD CONSTRAINT 约束名 UNIQUE(列名);
    2. alter table emp add constraint emp_uk unique(name);

    7,给表中某字段删除唯一性约束

            使用DDL语句删除唯一性约束。删除之前需要弄清楚删除的约束名是对哪一个字段进行约束的。

    1. ALTER TABLE 表名 DROP KEY 约束名;
    2. alter table emp drop key emp_uk;

    8,被表中某个字段添加非空约束

            使用DDL语句添加非空约束。或者Navicat。

    1. ALTER TABLE 表名 MODIFY 列名 类型 NOT NULL;
    2. alter table emp modify salary float(8,2) not NULL;

    9,删除表中某个字段的非空约束

            使用DDL语句删除非空约束。

    1. ALTER TABLE 表名 MODIFY 列名 类型 NULL;
    2. alter table emp modify salary float(8,2) NULL;

    三,创建表的时候添加约束

    1,查询表中加了哪些约束?

     SHOW KEYS FROM 表名;

    2,创建表时添加约束

            创建 depts 表包含 department_id 该列为主键且自动增长,department_name 列不允许重复,location_id 列不允含有空值。

    1. create table depts
    2. (
    3. department_id int primary key auto_increment,
    4. department_name varchar(30) unique,
    5. location_id int not null
    6. );
  • 相关阅读:
    堆排序 — — 堆结构及问题【十大经典排序算法】
    安装包UI美化之路-nsNiuniuSkin多语言配置
    NSDateFormatter格式化字符串时间上相差8个小时的问题处理
    集合深度学习09—HashMap源码解析
    想要精通算法和SQL的成长之路 - K次取反后最大化的数组和
    作为前端你还不懂MutationObserver?那Out了
    leetCode 11. 盛最多水的容器 + 双指针
    SpringBoot项目打包与运行
    代码回滚,你真的理解吗?
    R语言选择data.table数据中的多个数据列并重命名筛选的数据列
  • 原文地址:https://blog.csdn.net/weixin_44992737/article/details/125452851