这是我参与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 开始);如果第一个数已经赋值,那么赋值的数据会被抛弃,报错。其余正常执行