• 数据约束


    数据约束

    定义对用户操作表的数据进行约束

    1、默认值

    作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值。

    注意:

    1)对默认值字段插入null是可以的。

    2)对默认值字段可以插入非null。

    CREATE TABLE student(
        id INT,
        NAME VARCHAR(20),
        address VARCHAR(20) DEFAULT '山东淄博'  -- 默认值
    )
    
    DROP TABLE student;
    -- 当字段没有插入值的时候,mysql自动给该字段分配默认值
    INSERT INTO student(id,NAME) VALUES(1,'张三');
    
    -- 注意:默认值的字段允许为null
    INSERT INTO student(id,NAME,address) VALUE(2,'李四',NULL);
    INSERT INTO student(id,NAME,address) VALUE(3,'王五','山东淄博');

    2、非空

    作用: 限制字段必须赋值

    注意:

    1)非空字符必须赋值。

    2)非空字符不能赋null。

    -- 需求: gender字段必须有值(不为null)
    CREATE TABLE student(
        id INT,
        NAME VARCHAR(20),
        gender VARCHAR(2) NOT NULL -- 非空
    )
    
    -- 非空字段必须赋值
    INSERT INTO student(id,NAME) VALUES(1,'李四');
    -- 非空字符不能插入null
    INSERT INTO student(id,NAME,gender) VALUES(1,'李四',NULL);

    3、唯一

    作用: 对字段的值不能重复

    注意:

    1)唯一字段可以插入null。

    2)唯一字段可以插入多个null。

    CREATE TABLE student(
        id INT UNIQUE, -- 唯一
        NAME VARCHAR(20)
    )
    
    INSERT INTO student(id,NAME) VALUES(1,'zs');
    INSERT INTO student(id,NAME) VALUES(1,'lisi'); -- ERROR 1062 (23000): Duplicate entry '1' for key 'id'
    
    INSERT INTO student(id,NAME) VALUES(2,'lisi');

    4、主键(重要)

    作用: 非空+唯一

    注意:

    1)通常情况下,每张表都会设置一个主键字段用于标记表中的每条记录的唯一性。

    2)建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的id字段。

    DROP TABLE student;
    
    CREATE TABLE student(
        id INT PRIMARY KEY, -- 主键
        NAME VARCHAR(20)
    )
    
    INSERT INTO student(id,NAME) VALUES(1,'张三');
    INSERT INTO student(id,NAME) VALUES(2,'张三');
    -- INSERT INTO student(id,NAME) VALUES(1,'李四'); -- 违反唯一约束: Duplicate entry '1' for key 'PRIMARY'
    
    -- insert into student(name) value('李四'); -- 违反非空约束: ERROR 1048 (23000): Column 'id' cannot be null

    5、自增长

    作用: 自动递增

    CREATE TABLE student(
        id INT(4) ZEROFILL PRIMARY KEY AUTO_INCREMENT, -- 自增长,从0开始  ZEROFILL 零填充
        NAME VARCHAR(20)
    )
    
    -- 自增长字段可以不赋值,自动递增
    INSERT INTO student(NAME) VALUES('张三');
    INSERT INTO student(NAME) VALUES('李四');
    INSERT INTO student(NAME) VALUES('王五');
    
    SELECT * FROM student;
    -- 不能影响自增长约束
    DELETE FROM student;
    -- 可以影响自增长约束
    TRUNCATE TABLE student;

    6、外键

    作用:约束两种表的数据

    出现两种表的情况:

    解决数据冗余高问题: 独立出一张表

    例如: 员工表  和  部门表

    问题出现:在插入员工表数据的时候,员工表的部门ID字段可以随便插入!!!!!

    使用外键约束:约束插入员工表的部门ID字段值

    解决办法: 在员工表的部门ID字段添加一个外键约束

    -- 部门表(主表)
    CREATE TABLE dept(
        id INT PRIMARY KEY,
        deptName VARCHAR(20)
    )
    
    -- 修改员工表(副表/从表)
    CREATE TABLE employee(
        id INT PRIMARY KEY,
        empName VARCHAR(20),
        deptId INT,-- 把部门名称改为部门ID
        -- 声明一个外键约束
        CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id)
        --           外键名称                  外键               参考表(参考字段)
    )

     注意:

    1)被约束的表称为副表,约束别人的表称为主表,外键设置在副表上的!!!

    2)主表的参考字段通用为主键!

    3)添加数据: 先添加主表,再添加副表

    4)修改数据: 先修改副表,再修改主表

    5)删除数据: 先删除副表,再删除主表

    外键约束:

    -- 员工表
    CREATE TABLE employee(
        id INT PRIMARY KEY,
        empName VARCHAR(20),
        deptName VARCHAR(20) -- 部门名称
    )
    
    INSERT INTO employee VALUES(1,'张三','软件开发部');
    INSERT INTO employee VALUES(2,'李四','软件开发部');
    INSERT INTO employee VALUES(3,'王五','应用维护部');
    
    SELECT * FROM employee;
    
    -- 添加员工,部门名称的数据冗余高
    INSERT INTO employee VALUES(4,'陈六','软件开发部');
    
    -- 解决数据冗余高的问题:给冗余的字段放到一张独立表中
    -- 独立设计一张部门表
    CREATE TABLE dept(
        id INT PRIMARY KEY,
        deptName VARCHAR(20)
    )
    
    DROP TABLE employee;
    
    -- 修改员工表
    CREATE TABLE employee(
        id INT PRIMARY KEY,
        empName VARCHAR(20),
        deptId INT,-- 把部门名称改为部门ID
        -- 声明一个外键约束
        CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) 
        --           外键名称                  外键               参考表(参考字段)
    )
    
    INSERT INTO dept(id,deptName) VALUES(1,'软件开发部');
    INSERT INTO dept(id,deptName) VALUES(2,'应用维护部');
    INSERT INTO dept(id,deptName) VALUES(3,'秘书部');
    
    INSERT INTO employee VALUES(1,'张三',1);
    INSERT INTO employee VALUES(2,'李四',1);
    INSERT INTO employee VALUES(3,'王五',2);
    INSERT INTO employee VALUES(4,'陈六',3);
    
    -- 问题: 该记录业务上不合法,员工插入了一个不存在的部门数据
    INSERT INTO employee VALUES(5,'陈六',4); -- 违反外键约束: 
    Cannot add or update a child row: a foreign key constraint fails (`day16`.`employee`, CONSTRAINT `emlyee_dept_fk` FOREIGN KEY (`deptId`) REFERENCES `dept` (`id`))
    -- 1)当有了外键约束,添加数据的顺序: 先添加主表,再添加副表数据 -- 2)当有了外键约束,修改数据的顺序: 先修改副表,再修改主表数据 -- 3)当有了外键约束,删除数据的顺序: 先删除副表,再删除主表数据 -- 修改部门(不能直接修改主表) UPDATE dept SET id=4 WHERE id=3; -- 先修改员工表 UPDATE employee SET deptId=2 WHERE id=4; -- 删除部门 DELETE FROM dept WHERE id=2; -- 先删除员工表 DELETE FROM employee WHERE deptId=2; SELECT * FROM dept; SELECT * FROM employee;
  • 相关阅读:
    HTB-靶机-Charon
    第一篇Active Directory疑难解答概述(1)
    Outlook Web App 客户端超时设置
    【Troubleshooting Case】Exchange Server 组件状态应用排错?
    【Troubleshooting Case】Unable to delete Exchange database?
    Exchange Server 2007的即将生命周期,您的计划是?
    "the hypervisor is not running" 故障
    Exchange 2016 体系结构
    USB PE
    10 months then free? 10个月,然后自由
  • 原文地址:https://www.cnblogs.com/Ace-suiyuan008/p/9302282.html
Copyright © 2020-2023  润新知