【问题标题】:How can I delete row from parent table has a referenced column to child table? [duplicate]如何从父表中删除行具有子表的引用列? [复制]
【发布时间】:2017-09-23 12:40:37
【问题描述】:

我在带有 SQlite 数据库的 javaFx 项目中使用 JDBC。我有两个表"PROJECT""SMAllPROJECT",例如PROJECT 有这个结构PROJECT(name,date,state)SMAllPROJECT 有这个结构SMAllPROJECT(name,date,state,*project_name*)Project_name 引用自 PROJECT tablename 列。

我正在尝试从PROJECT 中删除行,并且应该删除SMAllPoject 中引用的行。在 sqlite studio 中,我配置 onCascade 方法,当我应用从父表中删除一行时,当我在 SQlite studio 中测试它时一切都很好,但在我的代码中它只是从父表中删除了行。

这是我的代码:

控制器方法

public void ExecuteDeleteProject() {

        if (!SearchIdProjectSupp.getText().isEmpty()) {

            Project project = new ProjectDao().FindString(SearchIdProjectSupp.getText());
            new ProjectDao().Delete(project);
            String title = "Suppression";
            String message = "Vous avez supprimé le projet " + SearchIdProjectSupp.getText() + ".";
            NotificationType notification = NotificationType.SUCCESS;
            TrayNotification tray = new TrayNotification();
            tray.setTitle(title);
            tray.setMessage(message);
            tray.setNotificationType(notification);
            tray.setAnimationType(AnimationType.SLIDE);
            tray.setImage(new Image("Images/check.png"));
            tray.setRectangleFill(Paint.valueOf("#a8a9fe"));
            tray.showAndDismiss(Duration.seconds(4));
            SearchIdProjectSupp.setText("");
            SuppPaneProject.setVisible(false);
            DeleteProjetButton.setDisable(true);
            CountP.setVisible(true);
            CountP();
            CountR();
            CountPP();

        }

    }

DAO 模式方法

public boolean Delete(Project Object) {

        try {

            String queryDeletePerson = "DElETE FROM PROJECT WHERE name=" + "'" + Object.getName() + "'";//Query Insertion in Person_Table

            PreparedStatement preparedStatementPerson = Dbaconnection.getConnection().prepareStatement(queryDeletePerson);//Prepared statement i use this for high performance 

            preparedStatementPerson.execute();

        } catch (SQLException ex) {

            Logger.getLogger(EMPDao.class.getName()).log(Level.SEVERE, null, ex);
        }

        return true;
    }

这是我的 DDL

CREATE TABLE PROJECT (
    NAME VARCHAR2 (100) PRIMARY KEY,
    STATE  VARCHAR2 (100),
    DATEDBT DATE,
 );

CREATE TABLE SMALLPROJECT (
    NAMEPROJECT       VARCHAR2 (100) REFERENCES PROJECT (NAME) ON DELETE CASCADE
                                                          ON UPDATE CASCADE,
    NAME VARCHAR2 (20)  PRIMARY KEY,
    DATEDBT     DATE,
    STATE VARCHAR2 (20)  PRIMARY KEY

    );

【问题讨论】:

  • 你能分享一下表格的定义吗(不仅仅是列列表,还有用于创建它们的实际 DDL)?
  • @Mureinik,我分享了用于创建它们的实际 DDL。
  • 当您建立与 SQLite 数据库的 JDBC 连接时,您是否通过执行 PRAGMA foreign_keys = ON 或使用 SQLiteConfig 对象显式启用外键?
  • @MenaiAlaEddine 这些 DDL 会产生多个错误。你确定这些是你的 DDL?
  • @GordThompson 我使用了 SQLiteConfig 对象,它运行良好,谢谢。

标签: java jdbc sqlitejdbc


【解决方案1】:

根据SQLite Foreign Key SupportHow do you enforce foreign key constraints in SQLite through Java? 的回答 ,它应该在执行任何查询之前配置数据库连接。我遇到了这个问题,因为我没有强制外键约束。

public static final String DB_URL = "jdbc:sqlite:database.db";  
public static final String DRIVER = "org.sqlite.JDBC";  

public static Connection getConnection() throws ClassNotFoundException {  
    Class.forName(DRIVER);  
    Connection connection = null;  
    try {  
        SQLiteConfig config = new SQLiteConfig(); //I add this configuration 
        config.enforceForeignKeys(true);  
        connection = DriverManager.getConnection(DB_URL,config.toProperties());  
    } catch (SQLException ex) {}  
    return connection;  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 2016-12-03
    • 2019-03-04
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多