#常见约束

    含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性

    分类:六大约束

 not null:非空,用于保证该字段的值不能位空

          比如姓名、学号等

 default:默认,用于保证该字段有默认值

          比如性别

 primary key:主键,用于保证该字段的值具有唯一性,并且非空

          比如学号、员工编号等

 unique:唯一,用于保证该字段的值具有唯一性,可以为空

          比如座位号

check:检查约束【mysql中不支持】

          比如年龄(>18岁到>60岁,就可设置检查约束)、性别

 foreign key:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值

          在从表添加外键约束,用于主表中某列的值 比如student表的majorId字段 引用major表的主表majorId

          比如学生表的专业编号,员工表的部门编号,员工表的工种编号

 

添加约束的时机;

            1.创建表时

            2.修改表时

    

约束的添加分类:

列级约束:

                六大约束语法上都支持,但外键约束没有效果

  表级约束:

                除了非空、默认,其它的都支持

 

    主键和唯一的对比:

                    保证唯一性    是否允许为空    一个表中可有有多少个    是否允许组合

        主键      yes                    no                    最多有1个                    yes,但不推荐使用

        唯一      yes                    yes                   可以有多个                   yes,但不推荐使用

 

        CREATE TABLE 表名(

列级约束,  #与字段一起的对列进行约束

            字段名 字段类型,

表级约束  

        );

 

                                    位置                支持的约束类型                                是否可以起约束名

        列级约束:    列的后面           语法都支持,但外键没有效果                 不可以

        表级约束:    所有列的后面    默认和非空不支持,其它支持                可以(主键没有效果)

 

    #一、创建表时添加约束

#1.添加列级约束

    

DROP DATABASE IF EXISTS stus;
        CREATE DATABASE IF NOT EXISTS students;
        USE students;
        CREATE TABLE stuinfo(
PRIMARY KEY,#主键
NOT NULL,#非空
CHECK(gender IN('男','女')),#检查约束
UNIQUE,#唯一约束
DEFAULT,18
INTFOREIGN KEY
        );
 
        #major专业表
        CREATE TABLE major(
            id INT PRIMARY KEY,
            majorName VARCHAR(20)
        );
        DESC stuinfo;

        

mysql 性别索引 mysql性别约束_mysql 性别索引

 

#查看表中所有的索引,包括主键、外键、唯一

        SHOW INDEX FROM stuinfo;

        

mysql 性别索引 mysql性别约束_字段_02

 

     #2.添加表级约束

        语法:在各个字段的最下面

        【constraint 约束名】 约束类型(字段名)

            可以省略

 

  

DROP TABLE IF EXISTS stuinfo;
        CREATE TABLE stuinfo(
            id INT,
            stuName VARCHAR(20),
            gender CHAR(1),
            seat INT,
            age INT,
            majorid INT,

 #表级约束constraint约束

CONSTRAINT pk PRIMARY KEY(id),#为id列添加主键

CONSTRAINT uq UNIQUE(seat),#唯一键

 CONSTRAINT ck CHECK(gender IN('男','女')),#检查约束

CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REENCES major(id)#外键    

        );

SHOW INDEX FROM stuinfo;

 

mysql 性别索引 mysql性别约束_mysql 性别索引_03

 

#通用的写法:

 

CREATE TABLE IF NOT EXISTS stuinfo(
            id INT PRIMARY KEY,
            stuName VARCHAR(20) NOT NULL,
            gender CHAR(1),
            seat INT UNIQUE,
            age INT DEFAULT 18,
            majorid INT,
            CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)
        );

 #两个字段组合成一个主键 或两个字段组合成一个唯一键但不推荐使用

  

CREATE TABLE stuinfo(
        id INT,
        stuName VARCHAR(20),
        gender CHAR(1),
        seat INT,
        age INT,
        majorid INT,

PRIMARY KEY(id,stuName),#两个列组合成一个主键

#两个列组合成一个唯一键

 

CONSTRAINT ck CHECK(gender IN('男','女')),#检查约束
        CONSTRAINT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)#外键
    );
SELECT * FROM stuinfo;

    #两个主键不重复 可以插入 插入id与stuName一致时 会出现错误

    INSERT INTO stuinfo VALUE(1,'join','男',NULL,18,1);

    INSERT INTO stuinfo VALUE(2,'join','女',NULL,19,2);

    

mysql 性别索引 mysql性别约束_外键_04

 

 

#二、修改表时添加约束

1.添加列级约束

            alter table 表名 modify colunm 字段名 字段类型 新约束;

2.添加表级约束

            alter table 表名 add 【constraint 约束名】 约束类型(字段名) 【外键的引用(字段名)】

 

  

DROP TABLE IF EXISTS stuinfo;
        CREATE TABLE stuinfo(
            id INT,
            stuName VARCHAR(20),
            gender CHAR(1),
            seat INT,
            age INT,
            majorid INT
        );
        DESC stuinfo;

 #1.添加非空约束

        ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NOT NULL;

#2.添加默认约束

        ALTER TABLE stuinfo MODIFY COLUMN age INT DEFAULT 18;

    #3.添加主键

#Ⅰ.列级约束

        ALTER TABLE stuinfo MODIFY COLUMN id INT PRIMARY KEY;

#Ⅱ.表级约束 

        ALTER TABLE stuinfo ADD PRIMARY KEY(id);

#主键起了名字也是没有效果的

        ALTER TABLE emp2 ADD CONSTRAINT my_emp_id_pk PRIMARY KEY(id);

#4.添加唯一键

#Ⅰ.列级约束

        ALTER TABLE stuinfo MODIFY COLUMN seat INT UNIQUE;

#Ⅱ.表级约束

        ALTER TABLE stuinfo ADD PRIMARY KEY(id);

#5.添加外键

#默认的外键名

        ALTER TABLE stuinfo ADD FOREIGN KEY(majorid) REFERENCES major(id);

        SHOW INDEX FROM stuinfo;

#有名字的外键

        ALTER TABLE stuinfo ADD CONSISTENT fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id);

 

#三、修改表时删除约束

#1.删除非空约束

            ALTER TABLE stuinfo MODIFY COLUMN stuName VARCHAR(20) NULL;

#2.删除默认约束

            ALTER TABLE stuinfo MODIFY COLUMN age INT;

#3.删除主键约束

            ALTER TABLE stuinfo DROP PRIMARY KEY;#【推荐】

            ALTER TABLE stuinfo MODIFY COLUMN id INT;

#4.删除唯一

            ALTER TABLE stuinfo DROP INDEX seat;#DROP INDEX 唯一键约束名

#5.删除外键

            ALTER TABLE stuinfo DROP FOREIGN KEY fk_stuinfo_major;

            SHOW INDEX FROM stuinfo;