MySQL学习笔记(九)

170 阅读2分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

 【案例】:测试一个字段的多种联合约束
 drop table if exists t_vip ;
 create table t_vip (
     id int ,
     name varchar(255) not null unique 
 );
 desc t_vip ;
 +-------+--------------+------+-----+---------+-------+
 | Field | Type         | Null | Key | Default | Extra |
 +-------+--------------+------+-----+---------+-------+
 | id    | int(11)      | YES  |     | NULL    |       |
 | name  | varchar(255) | NO   | PRI | NULL    |       |       PRI表示主键
 | email | varchar(255) | YES  |     | NULL    |       |
 +-------+--------------+------+-----+---------+-------+
 3 rows in set (0.00 sec)
 ​
 ​
 insert into t_vip (id , name) values (1 , 'zhangsan');
 insert into t_vip (id , name) values (2 , 'zhangsan');  // 错误
 insert into t_vip (id) values (2) ;    // 错误

4.3 主键约束

  • primary key (pk) :

  • 相关概念:

    • 主键约束:在主键上加的约束 , 一张表只能添加一个(复合主键也算一个)
    • 主键字段:含有主键的字段
    • 主键值:主键字段中的每一个值 , 每一行记录的唯一标识 , 类似于身份证号 不能重复、不能为null ,具有唯一性。主键值建议使用int \ bigint \ char 类型,不建议用varchar。主键值一般为数字,一般为定长
  • 注意:任意一张表都要有主键 ,如果没有主键,表无效

 【案例】:测试主键约束
  drop table if exists t_vip ;
  create table t_vip (
     id int primary key,
      name varchar(255)
  );
  insert into t_vip (id ,name) values (1 , 'zhangsan');
  insert into t_vip (id ,name) values (2 , 'lisi');
  select * from t_vip ;
  
  insert into t_vip (id ,name) values (2 , 'wangwu')
  //ERROR 1062 (23000): Duplicate entry '2' for key 'PRIMARY'
  
  insert into t_vip (name) values ('zhaoliu');
  //ERROR 1364 (HY000): Field 'id' doesn't have a default value
  
  • 添加联合主键约束 (可以添加联合主键) ------- 复合主键

    • 一个字段 ----- 单一主键
    • 多个字段 ------ 复合主键 (不建议)
 【案例】:展示添加联合主键约束
  drop table if exists t_vip ;
  create table t_vip (
     id int ,
      name varchar(255),
      email varchar(255),
      primary key(id ,name)
  );
  desc t_vip ;
  +-------+--------------+------+-----+---------+-------+
 | Field | Type         | Null | Key | Default | Extra |
 +-------+--------------+------+-----+---------+-------+
 | id    | int(11)      | NO   | PRI | NULL    |       |
 | name  | varchar(255) | NO   | PRI | NULL    |       |
 +-------+--------------+------+-----+---------+-------+
 2 rows in set (0.00 sec)
 ​
 insert into t_vip (id , name , email) values (1 , 'zhangsan' , 'zhangsan@123.com');
 insert into t_vip (id , name , email) values (1 , 'lisi' , 'lisi@xina.com');
 select * from t_vip ;    // 可以运行
  • 分类:自然主键、业务主键

    • 自然主键:主键值是一个自然数,和业务没关系
    • 业务主键:主键值和业务紧密关联。例如主键值是银行卡号,为业务主键
  • 在开发中,用自然主键使用多一点。(因为主键只要做到不重复就行)

  • 机制:自动维护主键值 auto_increment 表示自增(从1 开始);如果第一个数已经赋值,那么赋值的数据会被抛弃,报错。其余正常执行