MYSQL约束03约束1

1、约束概念

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

2、分类:

  1. 主键约束:primary key

  2. 非空约束:not null

  3. 唯一约束:unique

  4. 外键约束:foreign key

3、非空约束: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);

4、唯一约束:unique,某一列的值不能重复

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

  2. 在创建表时,添加唯一约束

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

  3. 删除唯一约束

   ALTER TABLE stu MODIFY phone_number VARCHAR(20); -- 删除不了唯一约束
   ALTER TABLE stu DROP INDEX phone_number;

  4. 在表创建完后,添加唯一约束

   ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE; -- 如果phone_number列存在重复值则添加唯一约束失败

5、主键约束:primary key

  1. 注意:

    a. 含义:非空且唯一

    b. 一张表只能由一个字段为主键  

    c. 主键就是表中记录的唯一标识

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

   CREATE TABLE stu(

      id INT PRIMARY KEY , -- 给id添加主键约束
      NAME VARCHAR(20)
   );

  3. 删除主键

   ALTER TABLE stu MODIFY id INT; -- 并不会删除主键
   ALTER TABLE stu DROP PRIMARY KEY;

  4. 创建完表后,添加主键

   ALTER TABLE stu MODIFY id INT PRIMARY KEY; -- 如果id存在重复的值则不能添加主键

  5. 自动增长

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

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

    CREATE TABLE stu(

        id INT PRIMARY KEY AUTO_INCREMENT, -- 给id添加主键约束
        NAME VARCHAR(20)
    );

    注意:

    INSERT INTO stu VALUES (10,'ccc');
    INSERT INTO stu VALUES (NULL,'ccc'); -- id=11,因为id只跟上一条记录的id值有关系,id=上一条记录的id+1

   c. 删除自动增长

    ALTER TABLE stu MODIFY id INT; 
    INSERT INTO stu VALUES (NULL,'ccc'); -- 删除主键后执行报id不能为null
    INSERT INTO stu VALUES (12,'ccc'); -- 插入成功

   d. 添加自动增长

    ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;

  自动增长一般跟主键连到一起去使用,也可以不和主键连到一起使用,只是比较少。

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

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

   CREATE TABLE 表名(

      ...
      外键列
      CONSTRAINT 新起的外键名称 FOREIGN KEY (从表外键列名称) REFERENCES 主表名称(主表列名称)
   );

  练习:

-- 创建部门表(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_dep_fk FOREIGN KEY (dep_id) REFERENCES department (id)  -- 需要先创建部门表
); 

    注意:添加外键后,删除department表的主键值时若主键值在从表存在时会报异常,同理employee表添加不存在的外键值时也会报异常。

  2. 删除外键

   语法:ALTER TABLE 从表名 DROP FOREIGN KEY 新起的外键名称;   

    ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;

  3. 创建表后,添加外键

   语法:ALTER TABLE 从表名 ADD CONSTRAINT 新起的外键名称 FOREIGN KEY (从表外键列名称) REFERENCES 主表(主表列名称);

   ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id); -- 当employee表中dept_id值含有department中id不存在的数据时添加外键失败

  4. 级联操作

   a. 添加级联操作,级联更新,级联删除

    ALTER TABLE 从表名 ADD CONSTRAINT 新起的外键名称 FOREIGN KEY (从表外键列名称) REFERENCES 主表(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE ;

   b. 分类:

    级联更新:ON UPDATE CASCADE,表示主表主键值更新,对应从表的外键值自动更新

    级联删除:ON DELETE CASCADE,表示主表主键值删除,则对应的从表的外键值所在的记录删除 

  实际的开发中级联操作比较谨慎。

原文地址:https://www.cnblogs.com/ajing2018/p/15690784.html