zoukankan      html  css  js  c++  java
  • 约束:主键、非空、唯一、外键

    一、概念

    对表中的数据进行限定,保证数据的正确性、有效性和完整性。

    二、分类

    1)、主键约束:primary key

    2)、非空约束:not null

    3)、唯一约束:unique

    4)、外键约束:foreign key

    三、非空约束

    not null,某一列的值不能为null

    1、创建表时添加约束

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

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

    ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;

    3、删除name的非空约束

    ALTER TABLE stu MODIFY NAME VARCHAR(20);

    四、唯一约束

    unique,某一列的值不能重复

    注意:唯一约束可以有NULL值,但是只能有一条记录为null。

    1、在创建表时,添加唯一约束

    CREATE TABLE stu(
        id INT,
        phone_number VARCHAR(20) UNIQUE -- 手机号
    );

    2、删除唯一约束

    ALTER TABLE stu DROP INDEX phone_number;

    3、在表创建完后,添加唯一约束

    ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;

    五、主键约束

    注意:

    (1)、含义:非空且唯一

    (2)、一张表只能有一个字段为主键

    (3)、主键就是表中记录的唯一标识

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

    create table stu(
        id int primary key,-- 给id添加主键约束
        name varchar(20)
    );

    2、删除主键

    -- 错误 alter table stu modify id int ;
    ALTER TABLE stu DROP PRIMARY KEY;

    3、创建完表后,添加主键

    ALTER TABLE stu MODIFY id INT PRIMARY KEY;

    4、自动增长

    概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值得自动增长

    在创建表时,添加主键约束,并且完成主键自增长

    create table stu(
        id int primary key auto_increment,-- 给id添加主键约束
        name varchar(20)
    );

    删除自动增长

    ALTER TABLE stu MODIFY id INT;

    添加自动增长

    ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

    六、外键约束

    1、为什么要使用外键约束?

    # 创建部门表
    CREATE TABLE dept(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
    );
    INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
    # 创建员工表
    CREATE TABLE emp (
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(10),
    gender CHAR(1), -- 性别
    salary DOUBLE, -- 工资
    join_date DATE, -- 入职日期
    dept_id INT
    );
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','',7200,'2013-02-24',1);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','',3600,'2010-12-02',2);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','',9000,'2008-08-08',2);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','',5000,'2015-10-07',3);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','',4500,'2011-03-14',1);

    emp表如下:

    部门表如下:

    此时如果我们删除了开发部,

    DELETE FROM dept WHERE id = 1;

    虽然删除了开发部,但是这是不合适的,因为孙悟空和蜘蛛精都属于开发部,此时开发部还有人,故不应该删除开发部,如果删除的话,数据就不完整不正确了。

    我们使用外键约束可以解决这个问题。让emp表的dept_id关联dept表的主键id即可。

    我们添加外键

    TRUNCATE TABLE emp;
    ALTER TABLE emp ADD CONSTRAINT emp_dept_fk FOREIGN KEY (dept_id) REFERENCES dept(id);

    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
    INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);

    注意:要先删除数据才能添加外键。

    此时删除开发部

    此时,如果你想在emp表中添加一条记录而且dept_id不存在,如dept_id为4,则无法添加,因为有外键约束。

    注意:外键可以为null,但不能为不存在的外键值。

    2、foreign key,让表于表产生关系,从而保证数据的正确性。

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

    语法

    create table 表名(
        ....
        外键列
        constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)
    );

    2、删除外键

    ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

    3、创建表之后,添加外键

    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称);

    七、级联操作

    分类:

    1)、级联更新:ON UPDATE CASCADE 
    2)、级联删除:ON DELETE CASCADE

    1、为什么要添加级联操作?

    现在两个表emp和dept,如下所示:

     

     如果我们想把开发部的id改为4,则提示如下:

    我们也可以将emp表中id为1的dept_id先改为null,再修改dept表中开发部的id为4,再将dept_id为null的记录改为dept_id为4.

    UPDATE emp SET dept_id = NULL WHERE dept_id = 1;
    UPDATE emp SET dept_id = 4 WHERE dept_id IS NULL;

    但是这个操作很麻烦,那能不能当我们修改了dept表的主键id的值,然后emp表的相关的dept_id自动修改了呢?用级联操作可以解决。

    我们先删除外键

    ALTER TABLE emp DROP FOREIGN KEY emp_dept_fk;

    2、级联更新

    添加外键时添加级联操作

    语法

    ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE;

    此时,如果修改dept表的id,那么emp表的dept_id自动修改。

    3、级联删除

    如果在dept表中删除id为1的开发部,那么会自动删除emp表中dept_id为1的数据。

    注意:级联删除要慎用,级联删除很危险,有可能删除很多数据。

  • 相关阅读:
    .net同时执行多条sql语句(含事务功能)
    SQL标量值函数:小写金额转大写
    找出与某id相近的四条记录
    sql查询优化 索引优化
    半成品收发数量流程管控
    半成品进销存
    多表分页查询存储过程
    DataGridView数据用NPOI导出到Excel
    SQL事务+存储过程
    left join、right join和join的区别
  • 原文地址:https://www.cnblogs.com/zwh0910/p/15758133.html
Copyright © 2011-2022 走看看