主键约束的相关术语:

    • 主键约束:就是一种约束
    • 主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段
    • 主键值:主键字段中的每一个值叫做:主键值

    什么是主键?有啥用?
    主键值是每一个记录的唯一标识
    主键值是每一行记录的身份证号

    任何一张表都应该有主键,没有主键,表无效

    主键的特征:not null + unique(主键值不能是null,同时也不能重复)

    给一张表添加主键约束

    1. drop table if exists t_vip;
    2. create table t_vip(
    3. #一个字段做主键叫做:单一主键
    4. id int primary key, #列级约束
    5. name varchar(255)
    6. );
    7. insert into t_vip(id,name) values (1,'zhangsan');
    8. insert into t_vip(id,name) values (2,'lisi');
    9. #错误,主键不能重复
    10. insert into t_vip(id,name) values (2,'wangwu');
    11. select * from t_vip;
    12. insert into t_vip(name) values ('zhaoliu'); #错误,主键不能为空
    13. #主键可以使用表级约束
    14. create table t_vip(
    15. id int,
    16. name varchar(255),
    17. primary key(id) #表级约束
    18. );
    19. insert into t_vip(id,name) values (1,'zhangsan');
    20. insert into t_vip(id,name) values (2,'lisi');
    21. #错误:重复
    22. insert into t_vip(id,name) values (2,'wangwu');
    23. #表级约束主要是给多个字段联合起来添加约束
    24. create table t_vip(
    25. #id和name联合起来做主键:复合主键
    26. id int,
    27. name varchar(255),
    28. email varchar(255),
    29. primary key(id,name)
    30. );
    31. insert into t_vip(id,name,email) values (1,'zhangsan','zhangsan@123.com');
    32. insert into t_vip(id,name,email) values (1,'lisi','lisi@123.com');
    33. select * from t_vip;
    34. #错误:不能重复
    35. insert into t_vip(id,name,emali) values (1,'zhangsan','abc@123.com');
    36. #错误: Multiple primary key defined 一张表,主键约束只能添加一个
    37. create table t_vip(
    38. id int primary key,
    39. name varchar(255) primary key
    40. );

    主键值建议使用:

    • int
    • bigint
    • char
    • 等类型

    不建议使用:varchar来做主键,主键值一般都是数字,一般都是定长的

    主键:除了单一主键和复合主键之外,还可以这样进行分类

    • 自然主键:主键值是一个自然数,和业务没关系
    • 业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值,这就是业务主键

    实际开发中自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义
    业务主键不好,因为主键一旦与业务挂钩,那么当业务发生变动的时候,可能会影响
    到主键值,所以业务主键不建议使用,尽量使用自然主键

    #mysql中,有一种机制,可以帮助自动维护一个主键值
    create table t_vip(
        id int primary key auto_increment,
        name varchar(255)
    );
    insert into t_vip(name) values ('张三');
    insert into t_vip(name) values ('张三');
    insert into t_vip(name) values ('张三');
    insert into t_vip(name) values ('张三');
    insert into t_vip(name) values ('张三');
    insert into t_vip(name) values ('张三');
    insert into t_vip(name) values ('张三');
    select * from t_vip;