mysql主键primary key,外键foreign key

什么是主键? 为什么需要设置一个主键

作为表的行的唯一标识的候选关键字。一张表只有一个主键。主键可以由一个字段,也可以由多个字段组成。
主键的值不能重复,也不可以为空NULL
其实主键也是一种约束, 一种索引, 当建立了索引,在复杂多数据查询中,提高查询速度。
没有设置主键的时候,可以重复插入数据

insert into xue_sheng values(1,'测试',50,'男',1);

当要设置的主键数据已经存在重复的时候,那么设置主键失败。

mysql> alter table xue_sheng add constraint pk_xue_sheng primary key( id );

ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
要删除重复数据后,才能建立主键。

delete from xue_sheng where fen_shu=50;

查看表的结构

desc xue_sheng;
insert into xue_sheng values(5,'测试',50,'男',1);

删除主键

alter table xue_sheng drop primary key;

也可以在初始化表的时候,建立一个自动增长的id 作为主键(比较常见的做法)。

create table xue_sheng(
    id int(20) auto_increment not null primary key, 
    xing_ming varchar(50), 
    fen_shu int, 
    xing_bie char(2), 
    bj_id int
);
insert into xue_sheng(xing_ming,fen_shu,xing_bie,bj_id) values('张三',90,'男',1);

一次过插入多条数据,注意括号的写法和字段的数目保持一致

insert into xue_sheng(xing_ming,fen_shu,xing_bie,bj_id) values('李四',70,'男',2),('李小红',80,'女',1),('陈小明',80,'男',3);

删除自增长的主键id ,要注意的问题

mysql> alter table xue_sheng drop primary key;

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

1,先要删除自增长

alter table xue_sheng change id id int(20);

2,然后才能删除主键

alter table xue_sheng drop primary key;

外键, 数据参照的完整性, 也是一种约束

一张表的外键必须是另外一张表的主键

alter table xue_sheng add constraint fk_xue_sheng foreign key(bj_id) references ban_ji(id);

ERROR 1005 (HY000): Can't create table 'xue_xiao.#sql-b26_1' (errno: 150)

alter table ban_ji add constraint pk_ban_ji primary key( id );
alter table xue_sheng add constraint fk_xue_sheng foreign key(bj_id) references ban_ji(id);

创建外键后, 在学生表添加数据的bj_id 必须要参考班级表的主键id
受到外键约束,不能添加

insert into xue_sheng(xing_ming,fen_shu,xing_bie,bj_id) values('张三',90,'男',4);

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (xue_xiao.xue_sheng, CONSTRAINT fk_xue_sheng FOREIGN KEY (bj_id) REFERENCES ban_ji (id))

insert into xue_sheng(xing_ming,fen_shu,xing_bie,bj_id) values('张三',90,'男',3);

删除 班级表的数据同样受到限制

delete from ban_ji where id=3;

ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (xue_xiao.xue_sheng, CONSTRAINT fk_xue_sheng FOREIGN KEY (bj_id) REFERENCES ban_ji (id))

删除外键

alter table xue_sheng drop foreign key fk_xue_sheng;

check 约束

alter table xue_sheng add constraint ck_xue_sheng check( xing_bie='男' or xing_bie='女' );
alter table xue_sheng add constraint ck_xue_sheng check( xing_bie in('男','女' );

not null 非空

alter table xue_sheng change xing_ming xing_ming varchar(50) not null;

+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| xing_ming | varchar(50) | NO | | NULL | |

alter table xue_sheng change xing_bie xing_bie char(2) default '男' not null;

| Field | Type | Null | Key | Default | Extra |
| xing_bie | char(2) | NO | | 男 | |

insert into xue_sheng(xing_ming,fen_shu,bj_id) values('',90,3);
insert into xue_sheng(xing_ming,fen_shu,bj_id) values(null,90,3);

ERROR 1048 (23000): Column 'xing_ming' cannot be null

show create table xue_sheng;
CREATE TABLE `xue_sheng` (
  `id` int(20) NOT NULL DEFAULT '0',
  `xing_ming` varchar(50) NOT NULL,
  `fen_shu` int(11) DEFAULT NULL,
  `xing_bie` char(2) NOT NULL DEFAULT '男',
  `bj_id` int(11) DEFAULT NULL,
  KEY `fk_xue_sheng` (`bj_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容