gpt4 book ai didi

MySQL/Spring : Cannot delete or update a parent row a foreign key constraint fails

转载 作者:行者123 更新时间:2023-11-29 15:33:19 25 4
gpt4 key购买 nike

我读过一些确实提出同样问题的帖子,但我似乎无法弄清楚我的代码是否错误。我正在尝试遵循 Udemy for Java Spring 教程,但我尝试自己构建一些东西并添加额外的功能,以便更好地了解我正在学习的内容。我用 2 个表设置了下面的小数据库。

users 表是包含基本博客系统上的用户信息的表。 posts 表包含与用户关联的博客文章列表。

如果我理解正确,这将生成一对多关系,每个用户都有多个帖子。为了将帖子与用户联系起来,我使用 posts 表中的字段 author 设置了外键,引用了 posts 表中的 id 字段。 用户表。我还希望能够删除用户,但仍保留其所有帖子。我怎样才能实现这个目标?

现在我的应用程序以相反的方式工作,即它可以很好地删除帖子并且用户不受影响。我怎样才能反过来做到这一点?

我组织表格的方式正确吗?另外,我不一定想使用 SET FOREIGN_KEY_CHECKS=0 因为我知道这一点。如果foreign_key_checks被禁用,它可能会导致进一步的问题,对吗?当然,假设我的应用程序仅限于这两个表,我应该能够将检查设置为 0 以便使用它,但是,如果我要将其扩展或添加其他功能,这可能会导致问题(对吗?):D

PS - 我不会添加 Java 代码,因为它现在不相关,因为这只是一个数据库错误,被抛出了:(

drop table if exists `users`;

CREATE TABLE `users` (
`id` int not null auto_increment,
`username` varchar(50) NOT NULL,
`display_name` varchar(50) NOT NULL,
`first_name` varchar(255) NOT NULL,
`last_name` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`password` char(255) NOT NULL,
PRIMARY KEY (`id`),
KEY usr_id (`id`)
) ENGINE=InnoDB CHARSET=latin1 auto_increment=1 DEFAULT;

drop table if EXISTS `posts`;

CREATE TABLE `posts` (
`id` int unsigned NOT NULL auto_increment,
`title` varchar(255),
`author` int,
`date` datetime NOT NULL,
`excerpt` text NOT NULL,
`featured_media` blob,
`content` mediumtext NOT NULL,
`category` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY post_id (`id`),
FOREIGN KEY (author)
REFERENCES users(id)
ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB CHARSET=latin1 auto_increment=1;


insert into users VALUE (
'1','username','UserAuthor','AuthorFirstName','AuthorLastName','author@authoremail.com','test12345');

insert into posts (title,author,date,excerpt,featured_media,content,category) VALUE (
'First Post',
'1',
'2019-1-18 05:30:50',
'This is just an excerpt of the full text below',
NULL,
'This is just an excerpt of the full text below. This is below. This is the full text. Fancy, isn't it?',
'shitpost'
);

编辑:稍后编辑 - 我更感兴趣的是看看像 reddit 这样的公司是如何真正做到这一点的。您仍然可以查看已删除帐户的用户的评论。那么从这个意义上说,这是如何实现的呢?我确信必须使用外键来链接包含用户及其评论/帖子的信息的表。我还看到另一个选择可能是有另一个列来显示用户是否处于事件状态或非事件状态。但接下来的问题就变成了——这在 java 应用程序的上下文中如何工作?如果发送删除,标志将更改为“Y”...?

最佳答案

如果您确实想保留帖子而不包含任何有关作者的信息(例如,多个帖子是由同一前用户撰写的),请尝试:

    FOREIGN KEY (author)
REFERENCES users(id)
ON DELETE SET NULL ON UPDATE NO ACTION

根据Using FOREIGN KEY Constraints

就我个人而言,我倾向于保留用户记录,将其匿名并将其标记为不活动。

how would this work in the context of a java application?

那么,您的删除方法将发出 UPDATE SQL 命令,而不是 DELETE

关于MySQL/Spring : Cannot delete or update a parent row a foreign key constraint fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58519328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com