【问题标题】:Java : JDBC Delete Row IssueJava:JDBC 删除行问题
【发布时间】:2016-01-02 06:25:00
【问题描述】:

这是GUI 程序,当单击按钮时它会删除该行。但问题是它会出现这样的异常

Cannot delete or update a parent row: a foreign key constraint fails (`sakila`.`film_actor`, CONSTRAINT `fk_film_actor_actor` FOREIGN KEY (`actor_id`) REFERENCES `actor` (`actor_id`) ON UPDATE CASCADE)

我不知道这是什么意思,但我想删除该行有什么方法可以解决这个问题。 这是模式和表的快照。
代码:

public class GUI extends JFrame {

    public GUI() {
        super("Frame");
        setLayout(new FlowLayout());

        JButton b1 = new JButton("Click Delete Row");
        b1.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                try {

                    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/cinema", "hussnain", "toot");

                    String query = "delete from sakila.actor where actor_id=3";
                    PreparedStatement pre = conn.prepareStatement(query);

                    pre.executeUpdate();
                    JOptionPane.showMessageDialog(null, "Query Executed");
                } catch (Exception e1) {
                    JOptionPane.showMessageDialog(null, e1.getMessage());

                    e1.printStackTrace();
                }

            }

        });

        add(b1);

        setSize(400, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);

    }

}

主要方法

public class Main {

    public static void main(String[] args) {

        GUI obj = new GUI();


    }

}

【问题讨论】:

  • 我相信你有一个对另一个表的引用,你需要先删除它。检查表“film_actor”
  • 显示您的数据库架构。看来该行被具有外键约束的另一条记录引用(这意味着它不能在另一个存在时被删除)
  • @JamesWierzba 我上传了一个架构快照,但是如何在 java 中做到这一点
  • 这与 Swing 无关。这是您的 SQL 语句的问题。 (已移除 Swing 标签)。
  • 您是否希望您的外键不是ON DELETE CASCADE?您可能需要考虑添加它。

标签: java mysql jdbc


【解决方案1】:

您对film_actor 表有外键约束,因此在从actor 表中删除之前,您应该先从film_actor 表中删除。

也可以禁用外键检查,但会导致数据不一致;

SET FOREIGN_KEY_CHECKS=0; -- disable
SET FOREIGN_KEY_CHECKS=1; -- re-enable

【讨论】:

  • 禁用外键检查听起来像是使您的数据不一致的方法。
  • @MarkRotteveel 是的,显然需要考虑。
  • @FatihDonmez 我禁用 FOREIGN_KEY_CHECKS 现在它已删除,但有没有办法我可以在 java 中执行此操作首先禁用而不是重新启用,然后是正确的方法来执行此操作
  • 检查这个stackoverflow.com/a/4120517/975816@JohnDoe,但正如马克指出的那样,我会先从film_actor中删除,然后在一个事务中删除actor。通过这种方式,您的数据库中的数据状态将保持一致。
  • @FatihDonmez 你的意思是说我首先删除整个 fim_actor 表,然后从 actor 表中删除
【解决方案2】:

数据库中存在引用您尝试删除的 actor_id 的行。

检查您在film_actor 表中的数据。

【讨论】:

    【解决方案3】:

    您遇到的问题是查询报告您在表 film_actor 中存在与 actor 相关的外键的错误,现在要解决这个问题,您可以考虑 2 个选项:

    1) (不一致的一个) - 使用SET FOREIGN_KEY_CHECKS=0而忽略其余的,这样你在数据库中的信息在更新/删除后可能会不一致,这个选项会忽略其他的存在引用其他表中的条目并将继续删除,但会导致其他引用指向任何内容,从而导致数据不一致

    2) (建议一个) - 您可以管理您希望数据库如何“表示”现实的方式,这意味着您可以考虑删除某些表条目将如何工作和设置这些更新/删除将如何在同一对象的其他引用中传播,这意味着例如设置

    ON DELETE CASCADE
    

    在表定义中将允许删除该表的条目以从其他表中删除同一对象的其他引用,这意味着将删除仅包含该引用的其他条目;

    你可以使用

    ON DELETE SET NULL
    

    每当您在主表中删除该条目时,它会将其他表中其他条目的引用字段设置为 NULL,但如果该字段是另一个表的主键的一部分,则会导致错误,

    我只引用了 2 个选项,您可以将其用于您的案例,但您可以在此处查看“ON DELETE 的工作原理”的答案,以了解这一点并了解这如何适合您的情况

    What is MySQL's default ON DELETE behavior?

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 2020-04-27
      • 2011-04-05
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 1970-01-01
      相关资源
      最近更新 更多