主键约束唯⼀标识数据库表中的每条记录。 主键必须包含唯⼀的值,且不能包含null值。 每个表只能有⼀个主键,可以由单个列或多个列组成。 通常为每张表都指定⼀个主键,主键列建议使用bigint类型。 相当于:unique + not null
为id列添加非空和唯⼀约束
drop table student;
create table student (
id bigint not null unique,
name varchar(20) not null,
age int DEFAULT 18,
sno varchar(10) UNIQUE
);添加了非空和唯⼀约束之后Key列显示PRI表示主键
desc student;
当id列的重复时会发生主键冲突
insert into student(id, name, sno) values (1, '张三', '100001');
insert into student(id, name, sno) values (1, '李四', '100001');
通常把主键列设置为自动增长,让数据库维护主键值
drop table student;
# 重构学⽣表
create table student (
id bigint PRIMARY KEY auto_increment, # 设置⾃增主键
name varchar(20) not null,
age int DEFAULT 18,
sno varchar(10) UNIQUE
);# 主键列的值为NULL
insert into student(id, name, sno) values (NULL, '张三', '100001');
# 不指定主键
insert into student(name, sno) values ('李四', '100002');
# 主键列的值⾃动⽣成
select * from student;
Extra列显示auto_increment表示自增
desc student;
# 由于学号重复,产⽣了唯⼀冲突,导致插⼊失败,ID为3的主键值作废
insert into student(name, sno) values ('王五', '100002');
# 修改学号后成功插⼊数据
insert into student(name, sno) values ('王五', '100003');
# 查询后发现新记录ID列的值为4
select * from student;
#注:主键自增一次,数据库就记录了一个id的值,后续每次插入新的数据:id +1(作废的话也会被记录)
# ⼿动指定⼀个值
insert into student(id, name, sno) values (100, '赵六', '100004');
select * from student;
# 下⼀次⾃增从主键的最⼤值开始
insert into student(name, sno) values ('钱七', '100005');
select * from student;
语法:
INSERT ... ON DUPLICATE KEY UPDATE column = value [, column = value] ...# 插⼊ID为100,学号为100100的学⽣记录时,报主键冲突
insert into student(id, name, sno) values (100, '赵六', '100100');
# 可以使⽤以上语法,如果插⼊时有冲突则更新当前列的值
insert into student(id, name, sno) values (100, '赵六', '100100') ON DUPLICATE KEY UPDATE name = '赵六', sno = '100100';
# 两⾏受影响,表⽰删除了原来的记录,⼜新写⼊了⼀条记录
# 与update student set name = '赵六',sno ='100100'whereid = 100; 等效
语法:
REPLACE [INTO] table_name
[(column [, column] ...)]
VALUES
(value_list) [, (value_list)] ...
value_list: value, [, value] ...# 写⼊或更新Id为101的记录
REPLACE into student(id, name, sno) values (101, '钱七', '100101');
# 原数据已更新
select * from student;
# 写⼊⼀条新数据
REPLACE into student(id, name, sno) values (102, '吴⼋', '100102');
drop table student;
# 重构学⽣表
create table student (
id bigint PRIMARY KEY auto_increment, # 定义主键
name varchar(20) PRIMARY KEY # 定义主键
);
由多个列共同组成的主键,主键是否冲突以多个列的组成进行判定
drop table student;
# 重构学⽣表
create table student (
id bigint,
name varchar(20),
PRIMARY KEY (id, name) # 指定复合主键
);
# 插⼊数据
insert into student(id, name) values (1, '张三');
# 重复插⼊主键冲突,此时主键值由id和name两个列共同决定
insert into student(id, name) values (1, '张三');
# 修改id值插⼊成功
insert into student(id, name) values (2, '张三');
select * from student;
由于内容较多,会分为多篇讲解,预知后续内容,请看后续博客!!!