zoukankan      html  css  js  c++  java
  • mysql学习笔记-表的创建与约束

    1、表的结构

    用户表和数据字典是Oracle数据库中的两种类型的表
    用户表由用户创建
    数据字典由Oracle服务器创建和维护
    数据字典包括有关数据库的信息

    2、列、行

    列称为字段
    行又称为记录
    每个字段具有 字段名、字段长度、约束、默认值 属性

    3、约束

    在创建表字段的时候,需要对应给表添加相应的约束
    约束用于实施数据完整性,以确保表中的数据的完整
    主键约束、外键约束、唯一性约束、检查约束和NOT NULL约束

    MySQL可以使用check约束,但check约束对数据验证没有任何作用。

    -- 表名和字段名系统默认会转换大写,即不区分大小写
    DROP TABLE t_student;
    create table t_student
    (
      id int PRIMARY KEY NOT NULL, -- 主键必须唯一,不能为空
      stu_no INT UNIQUE ,-- 唯一约束,可以为空,除非设置为not NULL,并且可以有多个null
      stu_name varchar(20) NOT NULL,-- 非空约束
      stu_addr varchar(100) ,
      stu_phone varchar(11),
        stu_sex SMALLINT DEFAULT 1 CHECK(stu_sex in(0,1)),-- 检查约束,check约束
      stu_age tinyint(4)  NOT NULL DEFAULT 30 CHECK (stu_age BETWEEN 20 AND 60) -- 默认值约束,check约束对数据验证没有任何作用 not null必须在默认值前,否则会报错
    )

    4、UNIQUE与主键区别

    UNIQUE 可以为空,除非设置为not NULL,否则可以有多个null,
    主键唯一,不能重复,不能为空
    SELECT * FROM t_student;
    -- 插入报错的insert
    -- 主键唯一性
    INSERT INTO t_student VALUES (1,2314,'张三','深圳南山','13264581265',0,25);
    -- Duplicate entry '1' for key 'PRIMARY' 主键唯一,不能重复,报错
    INSERT INTO t_student VALUES (1,2315,'李四','深圳南山','13264581265',0,25);
    -- Column 'id' cannot be null 主键不能为空,报错
    INSERT INTO t_student VALUES (null,2313,'张三','深圳南山','13264581265',0,25);
    -- UNIQUE 可以为空,除非设置为not NULL,并且可以有多个null,插入成功
    INSERT INTO t_student VALUES (2,null,'李四','深圳南山','13264581265',0,25);
    INSERT INTO t_student VALUES (3,null,'王五','深圳南山','13264581265',0,25);
    -- 主键为空时,默认为0 ,第一条记录可以添加成功,第二天失败,因为主键唯一
    INSERT INTO t_student (stu_no,stu_name) VALUES (7844,'六六');
    -- check约束对数据验证没有任何作用,插入成功,不报错
    INSERT INTO t_student VALUES (4,2345,'王五','深圳南山','13264581265',0,80);

     5、外键约束

    如果想要删除父表,可以有两种方法:

    1、先drop子表,再drop父表。

    2、先删除约束alter table emp_test drop constraint fk_emp_dept_test;,再drop父表。

    6、MySQL外键设置中的的 Cascade、NO ACTION、Restrict、SET NULL

       . cascade方式
    在父表上update/delete记录时,同步update/delete掉子表的匹配记录 

       . set null方式
    在父表上update/delete记录时,将子表上匹配记录的列设为null
    要注意子表的外键列不能为not null  

       . No action方式
    如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作  

       . Restrict方式
    同no action, 都是立即检查外键约束

       . Set default方式

    父表有变更时,子表将外键列设置成一个默认的值 但Innodb不能识别

    DROP TABLE t_dept;
    CREATE TABLE t_dept(
        dept_id INT(3) PRIMARY KEY,
        dept_no INT UNIQUE NOT NULL,
        dept_name VARCHAR(20) NOT NULL
    );
    
    DROP TABLE t_employee;
    CREATE TABLE t_employee(
        emp_id INT(3) PRIMARY KEY,
        emp_no INT(3) UNIQUE NOT NULL,
        emp_name VARCHAR(10) NOT NULL,
        emp_age tinyint(4) NOT NULL DEFAULT 25 CHECK (emp_age BETWEEN 20 AND 60),
        sex VARCHAR(1) CHECK (sex in ('','')),
        job VARCHAR(20),
        sal INT(10),
        -- inline写法
        -- REFERENCES 主表(主表字段)
        -- dept_no int  REFERENCES t_dept(dept_no)
        -- outline写法
    
      -- 删除外键时,引用外键的记录同步删除 
        -- dept_no int NOT NULL ,
        -- FOREIGN KEY(dept_no) REFERENCES t_dept(dept_no) ON DELETE CASCADE
        -- 删除外键时,引用外键的记录设置为空 
        dept_no int  ,
        FOREIGN KEY(dept_no) REFERENCES t_dept(dept_no) ON DELETE SET NULL
    );
    
    
    insert into t_dept values(1,10,'IT技术部门');
    insert into t_dept values(2,20,'市场部');
    insert into t_dept values(3,30,'人事部');
    
    -- 再插入员工数据
    
    
    INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
    VALUES(1,1,'张三',25,'','软件开发',8500,10);
    INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
    VALUES(2,102,'张天三',29,'','初级软件开发',4500,10);
    INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
    VALUES(3,103,'张一',36,'','测试人员',7500,10);
    INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
    VALUES(4,104,'王张三',63,'','人事主管',12500,20);
    INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
    VALUES(5,105,'发呆张三',60,'','高级程序员',18500,10);
    INSERT INTO `test`.`t_employee` (`emp_id`,`emp_no`,`emp_name`,`emp_age`,`sex`,`job`,`sal`,`dept_no`)
    VALUES(6,106,'快乐张三',30,'','销售经理',10500,30);
    
    SELECT * FROM t_employee;
    SELECT * FROM t_dept;
    -- MySQL设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。
    -- Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t_employee`, CONSTRAINT `t_employee_ibfk_1` FOREIGN KEY (`dept_no`) REFERENCES `t_dept` (`dept_no`))
    DELETE FROM t_dept WHERE dept_no = '10';
    
    -- 方法一:
    SET FOREIGN_KEY_CHECKS = 0; DELETE FROM t_dept WHERE dept_no = '30'; -- 删除完后记得外键约束重新打开; SET FOREIGN_KEY_CHECKS = 1; -- 查mysql版本 select version() from dual;

    -- 方法二:
    定义表时

       -- 删除外键时,引用外键的记录同步删除
         dept_no int NOT NULL ,
        FOREIGN KEY(dept_no) REFERENCES t_dept(dept_no) ON DELETE CASCADE

    -- 删除外键时,引用外键的记录设置为空 dept_no int , FOREIGN KEY(dept_no) REFERENCES t_dept(dept_no) ON DELETE SET NULL
  • 相关阅读:
    pygame--颜色变化
    pyQt绘图
    pyqt布局管理器
    java执行shell/cmd命令
    word公式编辑器公式
    pygame绘制文本
    2.add two number
    eltwise层
    crop层
    fcn
  • 原文地址:https://www.cnblogs.com/shishibuwan/p/10845717.html
Copyright © 2011-2022 走看看