MySQL19 - 4大约束

约束

什么是约束?约束的作用

在表的创建时,加入约束对表中数据进行规范,确保数据完整性、有效性

常见约束

  • 非空约束 NOT NULL -- 不能为NULL

    • DROP TABLE IF EXISTS t_vip;
      CREATE TABLE t_vip(
      	id INT,
      	name VARCHAR(255) NOT NULL
      );
      
  • 唯一性约束 UNIQUE -- 不能重复但可以为NULL

    • DROP TABLE IF EXISTS t_vip;
      CREATE TABLE t_vip(
      	id INT UNIQUE NOT NULL,  // 同时被UNIQUENOT NULL 约束,自动成为主键
      	name VARCHAR(255) UNIQUE,
      	email VARCHAR(255)
      );
      INSERT INTO t_vip
      	(id, name, email)
      VALUES
      	(1, NULL,'aaa@aaa');
      INSERT INTO t_vip
      	(id, name, email)
      VALUES
      	(2, NULL,'aaa@aaa');
      
    • MySQL中,同时被UNIQUE 和 NOT NULL 约束,自动成为主键 (Oracle中不一样)

    • 两个或多个字段联合判断唯一性 UNIQUE(字段1 , 字段2 , ... )

    • DROP TABLE IF EXISTS t_vip;
      CREATE TABLE t_vip(
      	id INT,
      	name VARCHAR(255),
      	email VARCHAR(255),
          UNIQUE(name, email)
      );
      INSERT INTO t_vip
      	(id, name, email)
      VALUES
      	(1, 'zhangsan','aaa@aaa');
      INSERT INTO t_vip
      	(id, name, email)
      VALUES
      	(2, 'lisi','aaa@aaa');
      INSERT INTO t_vip
      	(id, name, email)
      VALUES
      	(2, 'zhangsan','bbb@bbb');
      
  • 主键约束 PRIMARY KEY

  • 外键约束 FOREIGN KEY

  • 检查约束 CHECK(MySQL不支持,Oracle支持)


主键约束 PRIMARY KEY 简称PK

  • 添加主键约束的字段称为主键字段

  • 主键字段中的值称为主键值

  • 主键值是每一条记录的唯一标识

  • 主键 = NOT NULL + UNIQUE 不能为空不能重复

  • DROP TABLE IF EXISTS t_vip;
    CREATE TABLE t_vip(
    	id INT PRIMARY KEY,  // 列级约束
    	name VARCHAR(255) UNIQUE,
    	email VARCHAR(255)
    );
    
  • DROP TABLE IF EXISTS t_vip;
    CREATE TABLE t_vip(
    	id INT,
    	name VARCHAR(255) UNIQUE,
    	email VARCHAR(255),
        PRIMARY KEY(id)   // 表级约束
    );
    
  • 表级约束可用于多字段联合主键

    • DROP TABLE IF EXISTS t_vip;
      CREATE TABLE t_vip(
      	id INT,
      	name VARCHAR(255),
      	email VARCHAR(255),
          PRIMARY KEY(id, name)   // 表级约束 联合主键
      );
      
    • 但开发中不建议使用复合主键,更多使用单一主键

  • 主键值建议使用 INT BIGINT CHAR,主键值一般都为定长

  • 自然主键

    • 主键值是一个自然数,与业务无关
  • 业务主键

    • 主键值与业务关联,例如:学号、银行卡号等特殊唯一标识做主键
    • 在实际开发中,自然主键使用更多,因为主键不需要有意义,只用来确保记录不重复即可
    • 主键一旦和业务挂钩,但业务发生变动时,可能影响主键值,因此业务主键不推荐使用
  • AUTO_INCREMENT -- MySQL中,采用自增可以自动维护一个主键值

    • DROP TABLE IF EXISTS t_vip;
      CREATE TABLE t_vip(
      	id INT PRIMARY KEY AUTO_INCREMENT,
      	name VARCHAR(255),
      	email VARCHAR(255)
      );
      
    • 插入数据时,无需再传入 id 值


外键约束 FOREIGN KEY 简称FK

  • 添加外键约束的字段称为外键字段

  • 外键字段中的值称为外键值

  • 使用规则:

    • 表A中的 t字段是表B的主键,则表A 必须?将 t字段设置为外键,以此约束 t字段的内容从而符合表B

    • 或者 t字段在表B中是 UNIQUE字段,具有唯一标识的字段,则也可以设置为外键

  • SQL语句:表A的表级约束中 FOREIGN KEY (字段a) REFERENCES 表B (字段b)

  • 表A从表B继承字段b,命名为字段a,因此表A为“子表”,在建表时,表A一定在表B之后创建

  • DROP TABLE IF EXISTS t_student;
    DROP TABLE IF EXISTS t_class;
    CREATE TABLE t_class(
    	classno INT PRIMARY KEY,
    	classname VARCHAR(255)
    );
    CREATE TABLE t_student(
    	no INT PRIMARY KEY,
    	name VARCHAR(255),
    	cno INT,
    	FOREIGN KEY(cno) REFERENCES t_class(classno)
    );
    
  • 表A在插入数据时,字段a 的内容会有和 字段b 相同的约束

  • 父表中被引用的字段必须是主键吗?

    • 不一定是主键,外键可以为NULL,但必须具有唯一性 UNIQUE
  • 一个表的字段是另一个表的主键,一定要建立外键关系吗?

    • 一定要建立外键关系,否则两张表没有关联
posted @   LaViez  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示