广告表(advert): 字段名 类型 描述 id int 广告ID,主键 name varchar 广告名称 position_id int 广告位置ID media_id int 广告图片ID start_date 开始日期 end_date 结束日期 link varchar 广告链接 status int 状态 广告位置表(ad_position): 字段名 类型 描述 id int 广告位置ID,主键 name varchar 位置名称 width int 广告位置宽度 height int 广告位置高度 desc varchar 位置描述,其中广告表中的position_id存储的是广告位置表中的id,是外键关系,那么在删除advert表中信息时,不能删除ad_position对应的数据,该如何设置外键呢?
时间: 2024-02-03 20:01:41 浏览: 120
可以在创建 advert 表时,设置外键约束来实现该功能。具体操作如下:
1. 创建 advert 表时,将 position_id 字段设置为外键,并指定关联的 ad_position 表中的 id 字段。SQL 语句如下:
```
CREATE TABLE advert (
id int PRIMARY KEY,
name varchar(255),
position_id int,
media_id int,
start_date date,
end_date date,
link varchar(255),
status int,
FOREIGN KEY (position_id) REFERENCES ad_position(id)
);
```
2. 这样设置后,当试图删除 ad_position 表中被 advert 表所引用的记录时,会提示外键约束错误,从而防止误删 advert 表中的数据。
注意:在设置外键时,要确保关联的字段数据类型和长度相同,否则无法建立外键约束。
相关问题
广告表(advert): 字段名 类型 描述 id int 广告ID,主键 name varchar 广告名称 position_id int 广告位置ID media_id int 广告图片ID start_date 开始日期 end_date 结束日期 link varchar 广告链接 status int 状态 广告位置表(ad_position): 字段名 类型 描述 id int 广告位置ID,主键 name varchar 位置名称 width int 广告位置宽度 height int 广告位置高度 desc varchar 位置描述 广告媒体文件表(media_file): 字段名 类型 描述 id int 广告图片ID,主键 name varchar 媒体文件名称 type tinyint 媒体文件类型:0-图片,1-视频 link varchar 媒体文件URL地址 其中ad_position和media_file中的主键id分别对应advert中的外键position_id和media_id,在springboot项目中对广告进行添加和修改操作时,用注解该如何实现,请详细展示javadaim
在Spring Boot项目中,可以使用注解来实现对广告的添加和修改操作。具体实现步骤如下:
1. 定义实体类
首先需要定义三个实体类,分别对应广告、广告位置和媒体文件:
```java
@Entity
@Table(name = "advert")
public class Advert {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@ManyToOne
@JoinColumn(name = "position_id")
private AdPosition position;
@ManyToOne
@JoinColumn(name = "media_id")
private MediaFile mediaFile;
@Column(name = "start_date")
private Date startDate;
@Column(name = "end_date")
private Date endDate;
private String link;
private Integer status;
// 省略 getter 和 setter 方法
}
@Entity
@Table(name = "ad_position")
public class AdPosition {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer width;
private Integer height;
private String desc;
// 省略 getter 和 setter 方法
}
@Entity
@Table(name = "media_file")
public class MediaFile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer type;
private String link;
// 省略 getter 和 setter 方法
}
```
2. 定义控制器
接下来需要定义控制器来处理添加和修改广告的请求:
```java
@RestController
@RequestMapping("/adverts")
public class AdvertController {
@Autowired
private AdvertRepository advertRepository;
@Autowired
private AdPositionRepository adPositionRepository;
@Autowired
private MediaFileRepository mediaFileRepository;
@PostMapping
public Advert addAdvert(@RequestBody AdvertDto advertDto) {
Advert advert = new Advert();
advert.setName(advertDto.getName());
advert.setStartDate(advertDto.getStartDate());
advert.setEndDate(advertDto.getEndDate());
advert.setLink(advertDto.getLink());
advert.setStatus(advertDto.getStatus());
AdPosition position = adPositionRepository.findById(advertDto.getPositionId())
.orElseThrow(() -> new RuntimeException("Ad position not found"));
advert.setPosition(position);
MediaFile mediaFile = mediaFileRepository.findById(advertDto.getMediaId())
.orElseThrow(() -> new RuntimeException("Media file not found"));
advert.setMediaFile(mediaFile);
return advertRepository.save(advert);
}
@PutMapping("/{id}")
public Advert updateAdvert(@PathVariable Integer id, @RequestBody AdvertDto advertDto) {
Advert advert = advertRepository.findById(id)
.orElseThrow(() -> new RuntimeException("Advert not found"));
advert.setName(advertDto.getName());
advert.setStartDate(advertDto.getStartDate());
advert.setEndDate(advertDto.getEndDate());
advert.setLink(advertDto.getLink());
advert.setStatus(advertDto.getStatus());
AdPosition position = adPositionRepository.findById(advertDto.getPositionId())
.orElseThrow(() -> new RuntimeException("Ad position not found"));
advert.setPosition(position);
MediaFile mediaFile = mediaFileRepository.findById(advertDto.getMediaId())
.orElseThrow(() -> new RuntimeException("Media file not found"));
advert.setMediaFile(mediaFile);
return advertRepository.save(advert);
}
}
```
其中,`AdvertDto`是一个数据传输对象,用于接收客户端传来的广告信息:
```java
public class AdvertDto {
private String name;
private Integer positionId;
private Integer mediaId;
private Date startDate;
private Date endDate;
private String link;
private Integer status;
// 省略 getter 和 setter 方法
}
```
3. 定义数据访问层
最后需要定义数据访问层,用于对广告、广告位置和媒体文件进行增删改查操作:
```java
public interface AdvertRepository extends JpaRepository<Advert, Integer> {
}
public interface AdPositionRepository extends JpaRepository<AdPosition, Integer> {
}
public interface MediaFileRepository extends JpaRepository<MediaFile, Integer> {
}
```
至此,就实现了对广告的添加和修改操作。在客户端发送请求时,只需要将广告信息放入`AdvertDto`中发送给服务端即可。
CREATE TABLE advert ( id int(10) NOT NULL AUTO_INCREMENT COMMENT '主键', name varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '广告名称', position_id int(3) NOT NULL COMMENT '广告位置ID', media_id int(20) NOT NULL COMMENT '广告图片ID', start_date datetime NOT NULL COMMENT '开始日期', end_date datetime NOT NULL COMMENT '结束日期', link varchar(500) COLLATE utf8mb4_bin NOT NULL COMMENT '广告链接', status int(1) unsigned zerofill NOT NULL COMMENT '状态,0:未启用,1:已启用,2:已结束', create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id) USING BTREE, KEY FK_ad_image (media_id), KEY FK_ad_position (position_id), CONSTRAINT FK_ad_image FOREIGN KEY (media_id) REFERENCES media_file (id) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT FK_ad_position FOREIGN KEY (position_id) REFERENCES ad_position (id) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告表';CREATE TABLE user ( id varchar(30) NOT NULL COMMENT '用户 openid', session_key varchar(30) DEFAULT NULL COMMENT '用户 session_key', role int(2) DEFAULT NULL COMMENT '角色类型 1是用户,2是员工', phone_number varchar(20) DEFAULT NULL COMMENT '用户手机号', create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY open_id_UNIQUE (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';CREATE TABLE advert_click ( id int(10) NOT NULL AUTO_INCREMENT, advert_id int(10) NOT NULL COMMENT '广告ID', user_id varchar(30) COLLATE utf8mb4_bin NOT NULL COMMENT '用户IP', click_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '点击时间', PRIMARY KEY (id), KEY advert_id (advert_id), CONSTRAINT advert_click_ibfk_1 FOREIGN KEY (advert_id) REFERENCES advert (id) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告点击表';,advert_click表无法将user表中的id作为user_id的外键,这是为什么?
根据上述表结构,user表中的id字段是varchar类型,长度为30,而advert_click表中的user_id字段也是varchar类型,但是它没有设置长度,因此默认长度为1,不符合要求。如果你想将user表中的id作为advert_click表中user_id字段的外键,需要将其长度设置为30,即在创建advert_click表时将user_id字段定义为varchar(30)类型。
阅读全文