zoukankan      html  css  js  c++  java
  • MySQL数据库——数据约束

    什么数据约束

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

    2 默认值(缺省约束)

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

      注意:

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

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

    CREATE TABLE student(
        id INT,
        NAME VARCHAR(20),
        address VARCHAR(20) DEFAULT '默认值'

    1.3 非空

      作用: 限制字段必须赋值

      注意:

      1)非空字符必须赋值  

      2)非空字符不能赋null

    -- 需求: gender字段必须有值(不为null)
    CREATE TABLE student(
        id INT,
        NAME VARCHAR(20),
        gender VARCHAR(2) NOT NULL -- 非空
    )

    1.4 唯一

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

      注意:

      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');

    1.5 主键

      作用: 非空+唯一

      注意:

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

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

    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

    1.6 自增长

      作用: 动递增

    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;

    1.7 外键

      作用:约束两种表的数据

      出现两种表的情况:

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

      例如: 员工表    部门表

      问题出现:在插入员工表数据的时候,员工表的部门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)删除数据: 先删除副表,再删除主表

    -- 1.6 外键约束
    -- 员工表
    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;
  • 相关阅读:
    LeetCode 1110. Delete Nodes And Return Forest
    LeetCode 473. Matchsticks to Square
    LeetCode 886. Possible Bipartition
    LeetCode 737. Sentence Similarity II
    LeetCode 734. Sentence Similarity
    LeetCode 491. Increasing Subsequences
    LeetCode 1020. Number of Enclaves
    LeetCode 531. Lonely Pixel I
    LeetCode 1091. Shortest Path in Binary Matrix
    LeetCode 590. N-ary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/wode007/p/13164030.html
Copyright © 2011-2022 走看看