今天主要总结一下关于mysql中表和表之间的关系和约束语法
数据存储问题:
-
数据冗余
-
引发问题:
增删改异常和数据异常
解决方案:分表
实际开发中,一个项目通常需要很多张表才能完成。
外键约束
有两张表“分类表”和“商品表”,为了表明商品属于哪个分类,通常情况下将在商品表上添加一列,用于存放分类cid的信息,此列称为外键
分类表category称为主表,id称为主键
商品表product称为从表,category_id称为外键
在MySQL中只有innodb存储引擎才能支持主外键关联,MyISAM可以定义外键,但是系统不进行数据检查
create table t_catalog(
id bigint primary key auto_increment,
Name varchar(32) not null
)engine=innodb default charset utf8;
Create table t_product(
Id bigint primary key auto_increment,
Title varchar(50) not null,
Price numeric(8,2) default 0,
Catalog_id bigint, -- 用于表示商品所属的类别,这里的取值必须是t_catalog表中的id列上存在的数据,可以使用foreign key进行约束定义
Foreign key(catalog_id) references t_catalog(id) on delete cascade
)engine=innodb default charset utf8;
注意:外键上没有非空约束,如果需要非空,则在定义列时添加非空约束,即Catalog_id bigint not null
要求catalog_id的取值必须在t_catalog(id)中存在,否则报错
通过主表的主键和从表的外键来描述主外键关系,呈现就是一对多关系
外键特点
从表外键的值是对主表主键的引用
从表外键类型,必须与主表主键类型一致
基础语法
语法:alter table 从表 add constraint 约束名称 foreign key (从表外键列名称) references 主表 (主表的主键列名称);
[外键名称]用于删除外键约束的,一般建议_fk结尾或者fk_开头
举例:为student表添加外键约束。
ALTER TABLE student A