关键字: [ primary key ]
作用:用来唯一标识表中的一行记录
特点:1.唯一性约束+非空约束 唯一且为空
唯一性约束:不允许出现重复值
非空约束:不允许出现空值,但不是 NULL
2.一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建。
列级别创建写在某单个列的后面,表级别主键写在整个表的后面
3.主键约束对应着表中的一列或者多列(复合主键) 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复。
4.MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用。
5.当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询 的,就根据主键查询,效率更高)。
6.如果删除主键约束了,主键约束对应的索引就自动删除了。
需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的 值,就有可能会破坏数据的完整性。
添加主键约束:
create table temp
( id int primary key,
name varchar(20) );
测试设置了主键的列是否能插入充值
id 我们设置成了主键,先插入两条数据 id = 1, id = 2
INSERT INTO temp VALUES(1,'张三');
INSERT INTO temp VALUES(2,'李四');
后再重复插入 id = 1 的值,不要看name 他不是主键和这个约束无关
INSERT INTO temp VALUES(1,'周六');
错误提示:Duplicate entry '1' for key 'temp.PRIMARY'
测试:给设置了主键的 id 插入null看看
INSERT INTO temp VALUES(NULL,'李琦');#失败
Column 'id' cannot be null id列不允许为空
疑问:非空约束: 指的是 null 还是 ' '
众所周知,NULL指的是内存中中存储NULL值有地址,并且还要留有一定空间储存看是不是 NULL,空值也就是字段中存储空字符' '格子里什么都没有 也不用留有空去存它.
bug 在哪? 明显表格中显示什么都没有,却用 插入 null来测试是否为空 而不是 (' ')。
测试: 是否能插入多个主键
CREATE TABLE temp2(
id INT PRIMARY KEY,
NAME VARCHAR(20) PRIMARY KEY
); #错误
错误提示: Multiple primary key defined 定义了多个主键
删除主键约束:
语法:alter table 表名称 drop primary key;
ALTER TABLE student DROP(删除) PRIMARY KEY
复合主键:和表级主键差不多,表级主键,表中所有列组合设置为主键,复合主键你可以针对两个以上的列任意设置为复合主键
表级主键:
CREATE TABLE emp5( id INT ,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT emp5_id_pk PRIMARY KEY(id) ); CONSTRAINT emp5_id_pk 起别名的作用
对于 MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用
emp5_id_pk 这个是我给自定义的,但是查询出还是 priMary key
复合主键:
create table student_course(
sid int,
cid int,
score int, primary key(sid,cid) #复合主键 );
总结:告诉大家几个查看约束和索引的方法
SELECT * FROM information_schema.table_constraints
WHERE TABLE_NAME = '索引名';
DESC 索引名
指定需要查看数据表的索引
SHOW INDEX FROM 表名 FROM 数据库名;