zoukankan      html  css  js  c++  java
  • 大数据JavaWeb之MySQL基础---约束

    约束:

    下面具体来学习一下。

    非空约束:not null,值不能为null。

    创建表时添加约束:

    咱们创建一个新表,添加非空约束,如下:

    CREATE TABLE stu(
        id INT,
        NAME VARCHAR(20) NOT NULL -- name为非空
    );

    此时看一下表结构就可以看到name有一个非空约束:

    此时咱们用这个可视化的工具来添加一条非空的数据,肯定能正常添加上:

    而如果添加一个name为null的数据则会报错:

    删除name的非空约束:

     

    此时再看一下是否name的非空约束已经被删掉了:

    此时就又可以添加空数据了:

    创建表完后,添加非空约束:

    实际使用时可能会碰到对已经创建好表的某个字段要修改其约束,所以这里用这种方式来添加一下非空约束:

     

    唯一约束:unique,值不能重复。

    创建表时,添加唯一约束:

    这里先把之前的stu表删掉,再重新创建一个:

    咱们来试一下,如果添加重复的手机号是否会报错:

    【注意】:mysql中,唯一约束限定的列的值可以有多个null,下面添加多个为null的手机号试一下:

    确实是这样的。

    删除唯一约束:

     

    在创建表后,添加唯一约束:

    在删除唯一约束之后,咱们再来添加一下:

    主键约束:primary key。

    注意:

    • 含义:非空且唯一。
    • 一张表只能有一个字段为主键。
    • 主键就是表中记录的唯一标识。

    在创建表时,添加主键约束:

    删除主键:

     

    创建完表后,添加主键:

    自动增长: 

    • 概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长。
    • 在创建表时,添加主键约束,并且完成主键自增长。

      接下来则插入下数据:
    • 删除自动增长。

      此时再添加数据时就不会自动增长了:

    • 添加自动增长。 

    外键约束:foreign key,让表于表产生关系,从而保证数据的正确性。

    • 在创建表时,可以添加外键

      接下来实践之前先创建一个新表:

      CREATE TABLE emp (
          id INT PRIMARY KEY AUTO_INCREMENT,
          NAME VARCHAR(30),
          age INT,
          dep_name VARCHAR(30),
          dep_location VARCHAR(30)
      );
      -- 添加数据
      INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('张三', 20, '研发部', '广州'); INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('李四', 21, '研发部', '广州'); INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('王五', 20, '研发部', '广州');
      INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('老王', 20, '销售部', '深圳'); INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('大王', 22, '销售部', '深圳'); INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES ('小王', 18, '销售部', '深圳');


      以上数据的缺点如下:
      1、数据冗余:

       2、后期还会出现增删改的问题,要改的话则得改多处。
      解决方案就是将其重复的拆分到一张单独的表,然后利用外键约束来进行信息关联,如下:

      所以基于这样的思路,则重新创建表如下:

      -- 解决方案:分成 2 张表
      -- 创建部门表(id,dep_name,dep_location)
      -- 一方,主表
      CREATE TABLE department(
       id INT PRIMARY KEY AUTO_INCREMENT,
       dep_name VARCHAR(20),
       dep_location VARCHAR(20)
      );
      -- 创建员工表(id,name,age,dep_id)
      -- 多方,从表
      CREATE TABLE employee(
      id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20),
      age INT,
      dep_id INT -- 外键对应主表的主键
      )
      -- 添加2个部门
      INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳'); 
      SELECT * FROM department;
      -- 添加员工,dep_id 表示员工所在的部门
      INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
      INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1); 
      INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
      INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2); 
      INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2); 
      INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);
      SELECT * FROM employee;

       

       以上两张表之间木有任何关系,则会有如下的问题:当我们在employee的dep_id里面输入不存在的部门,数据依然可以添加.但是并没有对应的部门:

      , 实际应用中不能出现这种情况。employee 的 dep_id 中的数据只能是 department 表中存在的 id。所以此时约束一下dep_id只能是department表中已经存在的id,所以接下来则需要给表添加外键约束了。咱们先将目前存在的表都删掉,因为要重新加上外键约束之后再来创建:

      什么是外键约束?
       
      好,此时咱们修改一下SQL语句,加入外键约束:

      -- 解决方案:分成 2 张表
      -- 创建部门表(id,dep_name,dep_location)
      -- 一方,主表
      CREATE TABLE department(
       id INT PRIMARY KEY AUTO_INCREMENT,
       dep_name VARCHAR(20),
       dep_location VARCHAR(20)
      );
      -- 创建员工表(id,name,age,dep_id)
      -- 多方,从表
      CREATE TABLE employee(
      id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20),
      age INT,
      dep_id INT, -- 外键对应主表的主键
      CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id)
      );
      -- 添加2个部门
      INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳'); 
      SELECT * FROM department;
      -- 添加员工,dep_id 表示员工所在的部门
      INSERT INTO employee (NAME, age, dep_id) VALUES ('张三', 20, 1);
      INSERT INTO employee (NAME, age, dep_id) VALUES ('李四', 21, 1); 
      INSERT INTO employee (NAME, age, dep_id) VALUES ('王五', 20, 1);
      INSERT INTO employee (NAME, age, dep_id) VALUES ('老王', 20, 2); 
      INSERT INTO employee (NAME, age, dep_id) VALUES ('大王', 22, 2); 
      INSERT INTO employee (NAME, age, dep_id) VALUES ('小王', 18, 2);
      SELECT * FROM employee;

      此时如果删除主表时,则会报错了:

       而如果在从表中插入一个父表中木有的部门ip则也会出错:

    • 删除外键
      ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

      此时咱们添加数据就可以随意写了:

    • 创建表之后,添加外键
      ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);
    • 级联操作
      对于上面有外键约束的情况下,又有一个新问题出来了:
      “要把部门表中的 id 值 2,改成 5,能不能直接更新呢?”,咱们来试一下:

      那“要删除部门 id 等于 1 的部门, 能不能直接删除呢?”,下面来试一下:

      有一个比较笨的办法能解决这个问题,比如还是将部门id为2的改为5,可以这样做,先将从表id=2的设置的NULL,对于外键是可以设置为NULL的,如下:

      然后再将depart=1的改为5:

      最后再将从表的dep_id外键的值改为5:

      太麻烦了,这样操作,那有没有一种我要改顺带主从表都一起变的机制呢?级联操作就产生了,先来看一下啥叫级联?

       下面则具体来学习一下,在正式学习之前先来学习一个mysql的一个使用技巧,就是可以直观的来观测表之间的约束关系的,如下:

      先来打开这个设计器:

      然后把我们想看到表直接拖到窗口中来,比如我们想看一下给department和employee添加的外键约束的关系:

      所以有了这个利器,在未来表很多的时候,想要看表与表之间的关系用这个视图就比较方便了,好,接下来正式来学习下级联操作。

      1、添加级联操作:

      2、分类:

      ①、级联更新:ON UPDATE CASCADE
      下面来给咱们的表增加级联更新:

       此时咱们将那个部门id为5的又改成1,看这次能否直接成功?


      ②、级联删除:ON DELETE CASCADE
      接下来则来加一个级联删除,来满足当删除部门为1时,它相关的员工记录也被删除了,做法跟级联更新类似:

       然后咱们来删一下,看能否将员工对应的这个部门也给一并删掉了?

       

       确实达到了级联的目的,但是对于级联删除其实是很危险的,而且效率也不高,在实际使用时得要非常的谨慎。

  • 相关阅读:
    商贸通帐套隐藏方法
    固定资产打开提示:上年度数据未结转!
    ZOJ 2432 Greatest Common Increasing Subsequence
    POJ 1080 Human Gene Functions
    POJ 1088 滑雪
    POJ 1141 Brackets Sequence
    POJ 1050 To the Max
    HDOJ 1029 Ignatius and the Princess IV
    POJ 2247 Humble Numbers
    HDOJ 1181 变形课
  • 原文地址:https://www.cnblogs.com/webor2006/p/12121396.html
Copyright © 2011-2022 走看看