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

    默认值

    注意:             
        1)对默认值字段插入null是可以的。
        2)对默认值字段可以插入非null
    -- 1.1 默认值
    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,'王五','广州番禺');

    非空

    注意:
        1)非空字符必须赋值
        2)非空字符不能赋null
    -- 1.2 非空
    -- 需求: 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);

    唯一

    注意:
        1)唯一字段可以插入null                
        2)唯一字段可以插入多个null
    -- 1.3 唯一
    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)通常情况下,每张表都会设置一个主键字段。用于标记表中的每条记录的唯一性。
                    2)建议不要选择表的包含业务含义的字段作为主键,建议给每张表独立设计一个非业务含义的  id字段。
    -- 1.4 主键(非空+唯一)
    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

    自增长

    -- 1.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;

    外键

            作用:约束两种表的数据
            
            出现两种表的情况:
                解决数据冗余高问题: 独立出一张表        
                    例如: 员工表  和  部门表
            问题出现:在插入员工表数据的时候,员工表的部门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) ON UPDATE CASCADE ON DELETE CASCADE  
    -- ON CASCADE UPDATE :级联修改 -- 外键名称 外键 参考表(参考字段) ) 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;

     级联操作

    级联修改: ON UPDATE CASCADE
    级联删除: ON DELETE CASCADE
    CREATE TABLE employee(
        id INT PRIMARY KEY,
        empName VARCHAR(20),
        deptId INT,-- 把部门名称改为部门ID
        -- 声明一个外键约束
        CONSTRAINT emlyee_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id) ON UPDATE CASCADE ON DELETE CASCADE  -- ON CASCADE UPDATE :级联修改
        --           外键名称                  外键               参考表(参考字段)
    )
    注意: 级联操作必须在外键基础上使用
    -- 级联修改(修改)
    -- 直接修改部门
    UPDATE dept SET id=5 WHERE id=4;
    
    -- 级联删除
    -- 直接删除部门 
    DELETE FROM dept WHERE id=1;

    关联查询(多表查询)

    --  **************二、关联查询(多表查询)****************----
    -- 需求:查询员工及其所在部门(显示员工姓名,部门名称)
    -- 2.1 交叉连接查询(不推荐。产生笛卡尔乘积现象:4 * 4=16,有些是重复记录)
    SELECT empName,deptName FROM employee,dept;
    
    -- 需求:查询员工及其所在部门(显示员工姓名,部门名称)
    -- 多表查询规则:1)确定查询哪些表   2)确定哪些哪些字段   3)表与表之间连接条件 (规律:连接条件数量是表数量-1)
    -- 2.2 内连接查询:只有满足条件的结果才会显示(使用最频繁)
    SELECT empName,deptName       -- 2)确定哪些哪些字段
        FROM employee,dept    -- 1)确定查询哪些表
        WHERE employee.deptId=dept.id  -- 3)表与表之间连接条件
        
    -- 内连接的另一种语法
    SELECT empName,deptName
        FROM employee
        INNER JOIN dept
        ON employee.deptId=dept.id;
        
    -- 使用别名
    SELECT e.empName,d.deptName
        FROM employee e
        INNER JOIN dept d
        ON e.deptId=d.id;
    
    -- 需求: 查询每个部门的员工
    -- 预期结果:
     --  软件开发部  张三
     --  软件开发部  李四
     --  应用维护部  王五
     --  秘书部      陈六
     --  总经办      null 
    -- 2.2 左[外]连接查询: 使用左边表的数据去匹配右边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null
     -- (注意: 左外连接:左表的数据一定会完成显示!)
    SELECT d.deptName,e.empName
        FROM dept d
        LEFT OUTER JOIN employee e
        ON d.id=e.deptId;
    
    -- 2.3 右[外]连接查询: 使用右边表的数据去匹配左边表的数据,如果符合连接条件的结果则显示,如果不符合连接条件则显示null
     -- (注意: 右外连接:右表的数据一定会完成显示!)
    SELECT d.deptName,e.empName
        FROM employee e
        RIGHT OUTER JOIN dept d
        ON d.id=e.deptId;
    
    -- 2.4 自连接查询
    -- 需求:查询员工及其上司
    -- 预期结果:       
        -- 张三    null
        -- 李四    张三
        -- 王五    李四
        -- 陈六    王五
    SELECT e.empName,b.empName
        FROM employee e 
        LEFT OUTER JOIN employee b
        ON e.bossId=b.id;

    存储过程

    存储过程,带有逻辑的sql语句,存储过程带上流程控制语句(if  while
    1)执行效率非常快!存储过程是在数据库的服务器端执行的!!!
    2)移植性很差!不同数据库的存储过程是不能移植。
    存储过程语法
    
    -- 创建存储过程
    DELIMITER $       -- 声明存储过程的结束符
    CREATE PROCEDURE pro_test()           --存储过程名称(参数列表)
    BEGIN             -- 开始
        -- 可以写多个sql语句;          -- sql语句+流程控制
        SELECT * FROM employee;
    END $            -- 结束 结束符
    
    -- 执行存储过程
    CALL pro_test();          -- CALL 存储过程名称(参数);
    
    参数:
    IN:   表示输入参数,可以携带数据带存储过程中
    OUT: 表示输出参数,可以从存储过程中返回结果
    INOUT: 表示输入输出参数,既可以输入功能,也可以输出功能

    触发器

    例如: 当向员工表插入一条记录时,希望同时往日志表插入数据
    
    -- 需求: 当向员工表插入一条记录时,希望mysql自动同时往日志表插入数据
    -- 创建触发器(添加)
    CREATE TRIGGER tri_empAdd AFTER INSERT ON employee FOR EACH ROW    -- 当往员工表插入一条记录时
         INSERT INTO test_log(content) VALUES('员工表插入了一条记录');
         
    -- 插入数据
    INSERT INTO employee(id,empName,deptId) VALUES(7,'扎古斯',1);
    INSERT INTO employee(id,empName,deptId) VALUES(8,'扎古斯2',1);
    
    -- 创建触发器(修改)
    CREATE TRIGGER tri_empUpd AFTER UPDATE ON employee FOR EACH ROW    -- 当往员工表修改一条记录时
         INSERT INTO test_log(content) VALUES('员工表修改了一条记录');
         
     -- 修改
     UPDATE employee SET empName='eric' WHERE id=7;
     
    -- 创建触发器(删除)
    CREATE TRIGGER tri_empDel AFTER DELETE ON employee FOR EACH ROW    -- 当往员工表删除一条记录时
         INSERT INTO test_log(content) VALUES('员工表删除了一条记录');
      
     -- 删除
     DELETE FROM employee WHERE id=7;

    mysql权限问题

    -- ***********五、mysql权限问题****************
     -- mysql数据库权限问题:root :拥有所有权限(可以干任何事情)
     -- 权限账户,只拥有部分权限(CURD)例如,只能操作某个数据库的某张表
     -- 如何修改mysql的用户密码?
     -- password: md5加密函数(单向加密)
     SELECT PASSWORD('root'); -- *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
     
    --  mysql数据库,用户配置 : user表
    USE mysql;
    
    SELECT * FROM USER;
    
    -- 修改密码
    UPDATE USER SET PASSWORD=PASSWORD('123456') WHERE USER='root';
    
    -- 分配权限账户
    GRANT SELECT ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';
    GRANT DELETE ON day16.employee TO 'eric'@'localhost' IDENTIFIED BY '123456';
  • 相关阅读:
    MySQL 5.6 Reference Manual-14.1 Introduction to InnoDB
    CSS3 Media Queries 详细介绍与使用方法
    jQuery圆形统计图实战开发
    PHP+Mysql+jQuery实现中国地图区域数据统计(raphael.js)
    Javascript实战开发:教你使用raphael.js绘制中国地图
    WEB开发中常用的正则表达式集合
    互联网技术开发者必备的调试工具和脚本
    CSS3实战开发: 纯CSS实现图片过滤分类显示特效
    CSS3实战开发:使用CSS3实现photoshop的过滤效果
    :link,:visited,:focus,:hover,:active详解
  • 原文地址:https://www.cnblogs.com/linst/p/5873683.html
Copyright © 2011-2022 走看看