简体   繁体   English

SQLite外键问题

[英]SQLite foreign key problems

I've two tables that has defined as below; 我有两个定义如下的表; When i delete row from RELHOSPOL from the SQL Manager with executing a DELETE command, it nulls the necessary rows at the USER table. 当我通过执行DELETE命令从SQL Manager的RELHOSPOL中删除行时,它将使USER表上的必要行为空。 Whenever I delete a row from application with the method written below, it only deletes row from RELHOSPOL, and does not SET NULL the necessary rows at USER table. 每当我使用下面编写的方法从应用程序中删除行时,它只会从RELHOSPOL中删除行,而不会在USER表中将必要的行设置为NULL。 What is the missing point ? 遗漏点是什么?

CREATE TABLE [USER] (
  [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
  [GROUPID] INTEGER CONSTRAINT [FK_USER_GID] REFERENCES [GROUP]([ID]) ON DELETE SET NULL ON UPDATE CASCADE, 
  [HOSPITALID] INTEGER, 
  [POLIKLINIKID] INTEGER, 
  [NAME] VARCHAR(50) NOT NULL, 
  [LOGINID] VARCHAR(15) NOT NULL, 
  [EMAIL] VARCHAR(50) NOT NULL, 
  [PASSWORD] VARCHAR(32) NOT NULL, 
  CONSTRAINT [FK_USER_RELHOSPOL] FOREIGN KEY([HOSPITALID], [POLIKLINIKID]) REFERENCES [RELHOSPOL]([HOSPITALID], [POLIKLINIKID]) ON DELETE SET NULL ON UPDATE CASCADE);

CREATE UNIQUE INDEX [AS] ON [USER] ([LOGINID]);
CREATE UNIQUE INDEX [AS1] ON [USER] ([EMAIL]));

CREATE TABLE [RELHOSPOL] (
  [ID] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
  [HOSPITALID] INTEGER, 
  [POLIKLINIKID] INTEGER);

CREATE UNIQUE INDEX [UNIQUE_RELHOSPOL] ON [RELHOSPOL] ([HOSPITALID], [POLIKLINIKID]);

public void deletePoliklinikFromHospital(int hospitalId, int poliklinikId) throws SQLException{

        String query = "DELETE FROM [RELHOSPOL] WHERE (HOSPITALID = ? AND POLIKLINIKID = ?)";
        try {
            PreparedStatement statement = db.prepareStatement(query);
            statement.setInt(1, hospitalId);
            statement.setInt(2, poliklinikId);
            statement.executeUpdate();
        } catch (SQLException e) {
            throw new SQLException(e.getMessage());
        }
    }

You need to turn on enforcement of foreign keys , which is off by default for reasons of backward compatibility. 您需要打开外键强制实施,由于向后兼容,默认情况下该功能处于关闭状态。 It's a per-connection configuration option. 这是每个连接的配置选项。 Add this as one of the first things you do once you've made a Connection : 添加为你做的,一旦你已经做出了第一件事情之一Connection

PRAGMA foreign_keys = on;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM