需求:对专辑,曲目,评论,用户四个表进行关联,寻找每个表需要的数据信息,找出表与表之间的关系。
音乐专辑表名:Music
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| title | varchar(32) | 专辑名 |
| alias | varchar(32) | 专辑别名 |
| image | varchar(64) | 封面图片 |
| style | varchar(8) | 流派(如经典、流行、民谣、电子等) |
| type | varchar(4) | 类型(专辑、单曲等) |
| medium | varchar(4) | 介质(CD、黑胶、数字等) |
| publish_time | date | 发行时间 |
| publisher | varchar(16) | 出版者 |
| number | tinyint | 唱片数 |
| barcode | bigint | 条形码 |
| summary | varchar(1024) | 简介 |
| artist | varchar(16) | 艺术家 |
| id | int | 编号(唯一) |
曲目表名: Song
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| name | varchar(32) | 歌曲名 |
| serial_number | tinyint | 歌曲序号 |
| id | int | 编号(唯一) |
评论表名:Review
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| content | varchar(256) | 评论内容 |
| rating | tinyint | 评分(1~5) |
| review_time | datetime | 评论时间 |
用户表名:User
| 字段名 | 数据类型 | 说明 |
|---|---|---|
| username | varchar(16) | 用户名(唯一) |
| image | varchar(64) | 用户头像图片地址 |
| signature | varchar(64) | 个人签名,例如(本来无一物,何处惹尘埃!) |
| nickname | varchar(16) | 用户昵称 |
| id | int | 用户编号(主键) |
-- 专辑与用户之间为多对多的关系(一张专辑可多用户购买,一个用户也可以购买多张专辑)
-- 需要新建一张中间表对二者进行关联
create table Music_User ( id int primary key auto_increment,-- 编号(主键),自增长 Music_id int, -- 对应记录专辑编号 User_id int -- 对应记录用户编号 ); -- 添加外键约束 alter table Music_User add constraint fk_Music_id1 foreign key(Music_id) references Music(id); alter table Music_User add constraint fk_User_id1 foreign key(User_id) references User(id);
-- 专辑与曲目之间为一对多的关系(一张专辑可以有许多曲目,一首曲子只能在一张专辑中)
-- 一对多外键设置在多的一方,当前应设置在曲目表,评论表,评论表中
alter table Song add constraint fk_Music_Song foreign key(Music_id) references Music(id);
-- 专辑与评论之间为一对多的关系(一张专辑可以有许多评论,对应评论只能在一张专辑中)
-- 用户与评论之间为一对多的关系(一个用户可以有许多评论,对应评论只能属于一个用户)
alter table Review add constraint fk_Music_id2 foreign key(Music_id) references Music(id); alter table Review add constraint fk_User_id2 foreign key(User_id) references User(id);
当您删除数据时会发现这样一个提示
这边提示您的数据被外键约束了,不可以进行删除。
源代码:
-- 案例 CREATE TABLE Music ( title VARCHAr ( 32 ),-- 专辑名 alias VARCHAr ( 32 ),-- 专辑别名 image VARCHAr ( 64 ),-- 封面图片 style VARCHAr ( 8 ),-- 流派(经典,民谣等) type VARCHAr ( 4 ),-- 类型(单曲,专辑等) media VARCHAr ( 4 ),-- 介质(CD,黑胶) publish_time date,-- 发行时间 publisher VARCHAr ( 16 ),-- 出版者 number TINYINT,-- 唱片数 barcode BIGINT,-- 条形码 summary VARCHAr ( 1024 ),-- 简介 artist VARCHAr ( 16 ),-- 艺术家 id INT PRIMARY KEY -- 编号(主键) ); CREATE TABLE Song ( NAME VARCHAr ( 32 ), -- 歌曲名 serial_number TINYINT, -- 歌曲序号 id INT PRIMARY KEY, -- 编号(主键) Music_id INT -- 外键编号 ); CREATE TABLE Review ( content VARCHAr ( 256 ), -- 评论内容 rating TINYINT, -- 评分(1-5) review_time datetime, -- 评论时间 Music_id INT, -- 外键编号 User_id INT -- 外键编号 ); CREATE TABLE USER ( username VARCHAr ( 16 ) UNIQUE,-- 用户名(唯一) image VARCHAr ( 64 ),-- 用户头像图片地址 signature VARCHAr ( 64 ),-- 个人签名,例如(本来无一物,何处惹尘埃!) nickname VARCHAr ( 64 ),-- 用户昵称 id INT PRIMARY KEY -- 用户编号(主键) );-- 专辑与用户之间为多对多的关系(一张专辑可多用户购买,一个用户也可以购买多张专辑) -- 需要新建一张中间表对二者进行关联 CREATE TABLE Music_User ( id INT PRIMARY KEY auto_increment, -- 编号(主键),自增长 Music_id INT, -- 对应记录专辑编号 User_id INT -- 对应记录用户编号 );-- 添加外键约束 ALTER TABLE Music_User ADD CONSTRAINT fk_Music_id1 FOREIGN KEY ( Music_id ) REFERENCES Music ( id ); ALTER TABLE Music_User ADD CONSTRAINT fk_User_id1 FOREIGN KEY ( User_id ) REFERENCES USER ( id );-- 专辑与曲目之间为一对多的关系(一张专辑可以有许多曲目,一首曲子只能在一张专辑中) -- 一对多外键设置在多的一方,当前应设置在曲目表,评论表,评论表中 ALTER TABLE Song ADD CONSTRAINT fk_Music_Song FOREIGN KEY ( Music_id ) REFERENCES Music ( id );-- 专辑与评论之间为一对多的关系(一张专辑可以有许多评论,对应评论只能在一张专辑中) -- 用户与评论之间为一对多的关系(一个用户可以有许多评论,对应评论只能属于一个用户) ALTER TABLE Review ADD CONSTRAINT fk_Music_id2 FOREIGN KEY ( Music_id ) REFERENCES Music ( id ); ALTER TABLE Review ADD CONSTRAINT fk_User_id2 FOREIGN KEY ( User_id ) REFERENCES USER ( id ); SELECt * FROM Music;



