• 17、约束


    一、约束
    一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性
    分类:六大约束
    not null:非空,用于保证该字段的值不能为空,例如姓名、学号等
    default:默认值,用于保证该字段有默认值,例如性别等
    primary key:主键,用于保证该字段的值具有唯一性,并且非空,例如学号、员工编号等
    列级:
    alter table 表名 modify column 字段 字段类型 primary key;
    表级:
    alter table 表名 add primary key(字段);
    union:唯一,用于保证该字段的值具有唯一性,可以为空,例如座位等
    列级:
    alter table 表名 modify column 字段 字段类型 unique;
    表级:
    alter table 表名 add unique(字段);
    check:检查约束【mysql中不支持】
    foreign key:外键,用于限制两张表的关系,用于保证该字段的值必须来自于主表关联列的值,在从表添加外键约束,用于引用主表中某列的值,例如学生表的专业编号等等
    alter table 表名 add foreign key(从表字段) references 主表(字段);
    可以通过以下2种方式来删除主表数据:
    级联删除(on delete cascade):如果删除了主表数据,和之相关联的从表数据都会被删除
    设置级联删除:alter table 表名 add foreign key(从表字段) references 主表(字段) on delete cascade;
    级联置空(on delete set null):如果删除主表数据,和之相关联的从表相关联字段会被置为null:
    设置级联置空:alter table 表名 add foreign key(从表字段) references 主表(字段) on delete set null;
    外键:
    1、在从表设置外键关系
    2、从表的外键列的类型和主表的关联列的类型要求一致或兼容,名称无要求
    3、主表的关联列必须是一个key(一般是主键或唯一,外键也可以但意义不大)
    4、插入数据先插主表,删除数据先删从表
    添加约束的时机:
    1、创建表时
    2、修改表时(表中不存在数据)
    约束的添加分类:
    1、列举约束:六大约束语法上都支持,但外键约束没有效果
    2、表级约束:除了非空、默认,其他的都支持
    查看表中所有的索引,包括主键、外键、唯一
    show index from 表名;
    唯一性 是否可以为空 一个表中可以有多个 是否可以多字段组合
    主键 是 不可以 至多一个 可以,但不推荐
    唯一 是 可以(bdb引擎中一列不能同时存在2个等于null的值) 多个 可以,但不推荐
     
     
    二、创建表时添加约束:
    1、添加列级约束(列级约束不支持起约束名)
    语法:直接在字段名和类型后面追加约束类型即可
    只支持:默认、非空、主键、唯一
    -- 1、添加列级约束
    CREATE TABLE stuinfo (
    id INT PRIMARY KEY,# 主键
    stuName VARCHAR ( 50 ) NOT NULL,# 非空
    gender CHAR ( 2 ) CHECK ( gender = '' OR gender = '' ),# 检查  mysql无效果,仅做演示
    seat INT UNIQUE,# 唯一
    age INT DEFAULT 18,# 默认
    majorId INT REFERENCES major ( id ) # 外键   列级约束无效果,仅做演示
    );
    CREATE TABLE major ( id INT PRIMARY KEY, majorName VARCHAR ( 20 ) );
    2、添加表级约束(约束名不要用''括起来,否则会报错)
    语法:在各个字段的最下面添加
    constraint 约束名 约束类型(字段名) -- constraint 约束名 可以省略,如果省略约束名默认显示为字段名,主键约束名固定为primary,就算指定为其他名称也不生效
    添加外键约束:
    alter table 表名 add constraint 约束名 foreign key(字段名) references 主表名(字段名)
    -- 2、添加列级约束
    CREATE TABLE stuinfo (
        id INT,
        stuName VARCHAR ( 50 ),
        gender CHAR ( 2 ),
        seat INT,
        age INT,
        majorId INT,
        CONSTRAINT pk PRIMARY KEY ( id ),
        CONSTRAINT uq UNIQUE ( seat ),
        CONSTRAINT ck CHECK ( gender = '' OR gender = '' ),
    CONSTRAINT fk_stuinfo_major FOREIGN KEY ( majorId ) REFERENCES major ( id ) 
    );
    
    -- 通用写法
    CREATE TABLE if not exists stuinfo (
    id INT PRIMARY KEY,# 主键
    stuName VARCHAR ( 50 ) NOT NULL,# 非空
    gender CHAR ( 2 ) CHECK ( gender = '' OR gender = '' ),# 检查  mysql无效果
    seat INT UNIQUE,# 唯一
    age INT DEFAULT 18,# 默认
    majorId INTCONSTRAINT fk_stuinfo_major FOREIGN KEY ( majorId ) REFERENCES major ( id )  # 外键
    );
     
    三、删除约束
    1、主键约束
    alter table 表名 modify column 主键字段 字段类型;
    alter table 表名 drop primary key;
    2、唯一
    alter table 表名 drop index 创建唯一约束时的约束名;
    3、外键
    alter table 表名 drop foreign key 创建外键约束时的约束名;
    如果再添加外键约束时没有起别名,mysql会自动添加外键别名,可使用“show create table 表名;”查看
    在删除外键后用“show index from 表名;”查看仍然能看到之前删除了外键的字段仍然能查询到,原因是因为MYSQL在建外键后,会自动建一个同名的索引,我们需要再一次删除“alter table 表名 drop index key_name;”(key_name一般默认为字段名)
    4、默认
    alter table 表名 modify column 添加默认约束字段 字段类型;
    5、非空
    alter table 表名 modify column 添加非空约束字段 字段类型 null;(null可以省略)
    -- 1. 向表emp2的id列中添PRIMARY KEY约束 (my_emp_id_pk) 
    -- 列级
    alter table emp5 modify column employee_id varchar(50) primary key;
    -- 表级
    alter table emp5 add constraint my_emp_id_pk primary key(employee_id);
    show index from emp5;
    show create table emp5;
    -- 2. 向表dept2的id列中添加PRIMARY KEY约束(mydept_id_pk) 
    alter table dept2 add constraint mydept_id_pk primary key(department_id);
    -- 3. 向表emp2中添加列deptid,并在其中定义FOREIGNKEY约束,与之相关联的列是dept2表中的id列
    alter table emp5 add column deptid int;
    alter table emp5 add constraint fk_dept2_emp5 foreign key(deptid) references dept2(department_id);
     
  • 相关阅读:
    visio 改变画布大小
    Delphi 让自己的软件实现双击打开文件 转
    气相色谱里面的斜率灵敏度什么意思
    色谱峰的类型BB,BV,VB等都是什么意思
    Delphi的windows剪切板操作函数
    上传图片,多图上传,预览功能,js原生无依赖
    前端性能监控:window.performance
    ES6新属性笔记
    :jQuery实例【DEMO】
    自定义checkbox/radio
  • 原文地址:https://www.cnblogs.com/luohuasheng/p/16488666.html
Copyright © 2020-2023  润新知