目录
主键,外键和索引
一,主键 Primary Key
定义
主键就是在一个表中,能够唯一标识表内一行的一列或多列。
没有主键的话,删除和更新一行数据,会比较困难,因为你无法保证操作只涉及到你想要操作的行
主键并不是必须的,但是DBA都会给每个表生产主键,方便数据操作和管理
数据库系统会为主键自动建立唯一性索引
构成主键的列有什么要求:
1,任意2行不能有相同的主键
2,主键列不允许为NULL
3,主键列中的值不允许修改
4,主键值不能重用(就是说就是你删除了某行,这个行的主键值也不能用于新的行)
例子
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(5) NOT NULL DEFAULT '',
PRIMARY KEY (`id`,`name`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
此处,实际使用id作为主键即可,选择id和name作为主键,仅仅为演示如何用多列多主键
对于已经创建好的表,也可以添加主键(如果没创建的话)
Alter table user add Primary Key(id);
二,外键
定义
外键就是子表引用主表中的一列或多列,这些列构成了主表的主键。
它的作用是建立和加强2个表之间的数据连接,保证数据的一致性等。
外键列会被自动建立索引
例子
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(5) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `score` (
`id` int(11) NOT NULL,
`score` tinyint(4) DEFAULT '0',
KEY `fk_id` (`id`),
CONSTRAINT `fk_id` FOREIGN KEY (`id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
创建外键的语法:CONSTRAINT 外键名字 FOREIGN KEY (外键列的名字) REFERENCES 主表(主表中的列)
如果不指定CONSTRAINT 外键名字,数据库会自动生成一个名字
也可以在表创建后为表添加外键
alter table score add constraint fk_id foreign key (id) references user(id);
三,索引
定义
建立索引的目的是方便检索,加快访问速度
索引分为普通索引和唯一索引,主键是一种唯一索引。
例子
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(5) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
这个例子中,我们创建表时,为name列创建了普通索引
我们也可以创建表后,添加索引
alter table user add index idx_name (name);
添加唯一索引
alter table user drop index idx_name
alter table user add unique index idx_name(name);
四,概念对比
主键 vs 唯一索引
主键一定是唯一索引,但唯一索引不一定是主键
一个表中可以有多个唯一索引,但只能有一个主键
主键列不允许为空,但是唯一索引的列可以为空
主键可以被其他表作为外键引用,而唯一索引不行