MySQL/Spring:如果外键约束失败,则无法删除或更新父行

MySQL/Spring:如果外键约束失败,则无法删除或更新父行,mysql,sql,Mysql,Sql,我读过一些帖子,问了同样的问题,但我似乎不知道我的代码是不是错了。 我正试图遵循Udemy for Java Spring的教程,但我试图构建一些东西,并自己添加额外的功能,以便更好地了解我正在学习的内容。我用下面的两个表设置了小db users表包含基本博客系统的用户信息。posts表包含与用户关联的博客帖子列表 如果我理解正确,这将产生一对多的关系,每个用户都有几个帖子。为了将帖子绑定到用户,我在posts表中设置了带有author字段的外键,该字段引用user表中的id字段。我还想有能力删

我读过一些帖子,问了同样的问题,但我似乎不知道我的代码是不是错了。 我正试图遵循Udemy for Java Spring的教程,但我试图构建一些东西,并自己添加额外的功能,以便更好地了解我正在学习的内容。我用下面的两个表设置了小db

users
表包含基本博客系统的用户信息。
posts
表包含与用户关联的博客帖子列表

如果我理解正确,这将产生一对多的关系,每个用户都有几个帖子。为了将帖子绑定到用户,我在
posts
表中设置了带有
author
字段的外键,该字段引用
user
表中的
id
字段。我还想有能力删除一个用户,但仍然留在那里的所有职位。我怎样才能做到这一点

现在,我的应用程序的工作方式是相反的,即它删除一篇文章很好,用户不受影响。我怎么能反过来做呢

我自己组织桌子的方式正确吗?另外,我不一定要使用SET-FOREIGN\u-KEY\u-CHECKS=0,因为我知道这一点。如果禁用外键检查,可能会导致后续问题,对吗?当然,假设我的应用程序仅限于这两个表,我应该能够将检查设置为0,以便使用它,但是,如果我要向下扩展它或添加其他功能,这可能会导致问题(对吗?):D

PS-我没有添加Java代码,因为它现在不相关,因为这只是一个db错误,会按我的方式抛出:(

编辑:稍后编辑-我更感兴趣的是看看像reddit这样的公司是如何做到这一点的。你仍然可以看到用户的评论,他们已经删除了他们的帐户。从这个意义上说,这是如何实现的?我确信外键必须用于链接表,这些表将保存与他们的comm联系在一起的用户信息ents/posts。我还看到另一个选项可能是使用另一个列来显示用户是活动的还是非活动的。但从这一点开始,问题变成了-在java应用程序的上下文中如何工作?如果通过发送删除,则标志更改为“Y”

例如,reddit这样的公司是如何做到这一点的 仍然有用户的评论,他们已经删除了他们的 账目

你的问题有答案

我还看到另一种选择可能是另设一个专栏 这将显示用户是活动的还是非活动的

他们都在做同样的事情,他们没有删除用户信息,但他们使用一些字段设置用户,如is\u deleted=true

维护历史记录表也是存储任何用户的数据的一种方式,无论他们是否在系统中。但您可以看到,在删除用户帐户后,帖子具有该用户的名称。因此,明确地说,这是标记列的作用

这在java应用程序的上下文中是如何工作的?如果通过


是当您收到删除请求时,您可以使用is_deleted=True更新您的数据库。如果您确实想保留文章,而不包含任何关于作者的信息(例如,多篇文章由同一前用户撰写),请尝试:

依照

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

这在java应用程序的上下文中是如何工作的


嗯,您的delete方法将发出
UPDATE
SQL命令,而不是
delete

供参考:您的问题标题不适合您的真实问题。这似乎与我所想的非常接近……就我而言,on delete集null似乎是最相关的,因为我可能不想保留任何这些细节。然而,bilal提出的另一种解决方案,即仅仅添加另一个列,也可以起作用。
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'
);
    FOREIGN KEY (author)
        REFERENCES users(id) 
        ON DELETE SET NULL ON UPDATE NO ACTION