广告表(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 15:01:41 浏览: 29
可以在创建 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 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 ( 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 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 FK_advert_id (advert_id), KEY FK_user_id (user_id), CONSTRAINT FK_advert_id FOREIGN KEY (advert_id) REFERENCES advert (id) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT FK_user_id FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告点击表'; 报错cannot add foreign key constraint,这是为什么,请直接将带有外键的advert_click建表语句重构

可能是因为advert表和user表的id字段的类型和advert_click表的advert_id和user_id字段的类型不一致导致的。下面是新的建表语句: ``` 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 '用户 openid', click_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '点击时间', PRIMARY KEY (id), KEY FK_advert_id (advert_id), CONSTRAINT FK_advert_id FOREIGN KEY (advert_id) REFERENCES advert (id) ON DELETE NO ACTION ON UPDATE NO ACTION, KEY FK_user_id (user_id), CONSTRAINT FK_user_id FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告点击表'; ``` 在这个新的建表语句中,我将advert_click表的advert_id和user_id字段的类型改为和advert表和user表的id字段的类型一致。同时,我还将外键约束的顺序进行了调整,让先创建的表的id字段作为外键约束的主键。

相关推荐

CREATE TABLE advert ( id int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', name varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '广告名称', position_id int(20) NOT NULL COMMENT '广告位置ID', media_id int(20) NOT NULL COMMENT '广告图片ID', link varchar(500) COLLATE utf8mb4_bin NOT NULL COMMENT '广告链接', status int(1) unsigned zerofill NOT NULL COMMENT '状态,0:未启用,1:已启用,2:已结束', 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 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告表'; CREATE TABLE ad_position ( id int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', name varchar(50) COLLATE utf8mb4_bin NOT NULL COMMENT '位置名称', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告位置表'; CREATE TABLE media_file ( id int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', name varchar(30) COLLATE utf8mb4_bin NOT NULL COMMENT '媒体文件名称', type tinyint(1) NOT NULL COMMENT '媒体文件类型:0-图片,1-视频', url varchar(500) COLLATE utf8mb4_bin NOT NULL COMMENT '媒体文件URL地址', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告媒体文件表'; springboot项目用java写出三张表的orm对象(使用jpa外键依赖)并且对advert表的添加和删除操作不会影响ad_position表的数据

CREATE TABLE advert ( id int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', name varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '广告名称', position_id int(20) NOT NULL COMMENT '广告位置ID', media_id int(20) NOT NULL COMMENT '广告图片ID', link varchar(500) COLLATE utf8mb4_bin NOT NULL COMMENT '广告链接', status int(1) unsigned zerofill NOT NULL COMMENT '状态,0:未启用,1:已启用,2:已结束', 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 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告表'; CREATE TABLE ad_position ( id int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', name varchar(50) COLLATE utf8mb4_bin NOT NULL COMMENT '位置名称', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告位置表'; CREATE TABLE media_file ( id int(20) NOT NULL AUTO_INCREMENT COMMENT '主键', name varchar(30) COLLATE utf8mb4_bin NOT NULL COMMENT '媒体文件名称', type tinyint(1) NOT NULL COMMENT '媒体文件类型:0-图片,1-视频', url varchar(500) COLLATE utf8mb4_bin NOT NULL COMMENT '媒体文件URL地址', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='广告媒体文件表'; springboot项目用java写出三张表的orm对象(使用jpa外键依赖)

@Data @AllArgsConstructor @NoArgsConstructor @Builder @Table(name = "advert") public class Advert { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @ApiModelProperty(value = "广告唯一id") private Integer id; @ApiModelProperty(value = "广告名称") @NotBlank(message = "广告名称不可为空", groups = {AddGroup.class, UpdateGroup.class}) private String name; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "position_id") private AdPosition position; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "media_id") private MediaFile media; } @Data @AllArgsConstructor @NoArgsConstructor @Builder @Table(name = "ad_position") public class AdPosition { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @ApiModelProperty(value = "位置名称") @NotBlank(message = "位置名称不可为空", groups = {AddGroup.class}) private String name; @OneToMany(mappedBy = "AdPosition", cascade = CascadeType.ALL) private List<Advert> adverts = new ArrayList<>(); } @Data @AllArgsConstructor @NoArgsConstructor @Builder @Table(name = "media_file") public class MediaFile { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @ApiModelProperty(value = "媒体文件名称") private String fileName; @ApiModelProperty(value = "媒体文件类型") private Integer fileType; @ApiModelProperty(value = "媒体文件URL地址") private String fileUrl; @OneToMany(mappedBy = "MediaFile", cascade = CascadeType.ALL) private List<Advert> adverts = new ArrayList<>(); } public interface MyBaseMapper<T> extends Mapper<T>, MySqlMapper<T>,MyInsertListMapper<T> {} public interface AdvertMapper extends MyBaseMapper<Advert> {}如何在查询Advert表数据时,将关联的ad_position和media_file表中的数据一并查询

最新推荐

recommend-type

基于随机森林的数据分类预测Matlab程序RF 多特征输入多类别输出

基于随机森林的数据分类预测Matlab程序RF 多特征输入多类别输出 基于随机森林的数据分类预测Matlab程序RF 多特征输入多类别输出 基于随机森林的数据分类预测Matlab程序RF 多特征输入多类别输出 基于随机森林的数据分类预测Matlab程序RF 多特征输入多类别输出 基于随机森林的数据分类预测Matlab程序RF 多特征输入多类别输出 基于随机森林的数据分类预测Matlab程序RF 多特征输入多类别输出 基于随机森林的数据分类预测Matlab程序RF 多特征输入多类别输出 基于随机森林的数据分类预测Matlab程序RF 多特征输入多类别输出 基于随机森林的数据分类预测Matlab程序RF 多特征输入多类别输出
recommend-type

Go微服务教程项目使用领域驱动设计和洋葱架构.zip

Go微服务教程项目使用领域驱动设计和洋葱架构
recommend-type

520表白的表白的代码

520了表白成功我只能说520快乐了520快乐520祝您表白成功
recommend-type

vgg模型-通过CNN训练识别基于深度学习的车载摄像头图像中的交通事件分类-不含数据集图片-含逐行注释和说明文档.zip

vgg模型_通过CNN训练识别基于深度学习的车载摄像头图像中的交通事件分类-不含数据集图片-含逐行注释和说明文档 本代码是基于python pytorch环境安装的。 下载本代码后,有个环境安装的requirement.txt文本 如果有环境安装不会的,可自行网上搜索如何安装python和pytorch,这些环境安装都是有很多教程的,简单的 环境需要自行安装,推荐安装anaconda然后再里面推荐安装python3.7或3.8的版本,pytorch推荐安装1.7.1或1.8.1版本 首先是代码的整体介绍 总共是3个py文件,十分的简便 且代码里面的每一行都是含有中文注释的,小白也能看懂代码 然后是关于数据集的介绍。 本代码是不含数据集图片的,下载本代码后需要自行搜集图片放到对应的文件夹下即可 在数据集文件夹下是我们的各个类别,这个类别不是固定的,可自行创建文件夹增加分类数据集 需要我们往每个文件夹下搜集来图片放到对应文件夹下,每个对应的文件夹里面也有一张提示图,提示图片放的位置 然后我们需要将搜集来的图片,直接放到对应的文件夹下,就可以对代码进行训练了。 运行01
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

深入了解MATLAB开根号的最新研究和应用:获取开根号领域的最新动态

![matlab开根号](https://www.mathworks.com/discovery/image-segmentation/_jcr_content/mainParsys3/discoverysubsection_1185333930/mainParsys3/image_copy.adapt.full.medium.jpg/1712813808277.jpg) # 1. MATLAB开根号的理论基础 开根号运算在数学和科学计算中无处不在。在MATLAB中,开根号可以通过多种函数实现,包括`sqrt()`和`nthroot()`。`sqrt()`函数用于计算正实数的平方根,而`nt
recommend-type

react的函数组件的使用

React 的函数组件是一种简单的组件类型,用于定义无状态或者只读组件。 它们通常接受一个 props 对象作为参数并返回一个 React 元素。 函数组件的优点是代码简洁、易于测试和重用,并且它们使 React 应用程序的性能更加出色。 您可以使用函数组件来呈现简单的 UI 组件,例如按钮、菜单、标签或其他部件。 您还可以将它们与 React 中的其他组件类型(如类组件或 Hooks)结合使用,以实现更复杂的 UI 交互和功能。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依