我在Qt中有一个数据库。它有四个表:主组,子组,零件和位置。这是我的数据库:
CREATE TABLE `maingroup` (
`groupName`TEXT NOT NULL UNIQUE,
PRIMARY KEY(`groupName`)
);
CREATE TABLE `subgroup` (
`sub` TEXT NOT NULL UNIQUE,
`main` TEXT NOT NULL,
PRIMARY KEY(`sub`),
FOREIGN KEY(`main`) REFERENCES `maingroup`(`groupName`) ON DELETE CASCADE
);
CREATE TABLE `parts` (
`ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
`Part_Number` TEXT,
`Type` TEXT NOT NULL,
`Value` TEXT,
`Voltage` TEXT,
`Quantity` TEXT,
`Position` TEXT,
`Picture` TEXT,
FOREIGN KEY(`Position`) REFERENCES `Position`(`Poistion`) ON DELETE CASCADE,
FOREIGN KEY(`Type`) REFERENCES `subgroup`(`sub`) ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)
表部分中的类型是外键,指的是表子组中的列子。表子组中的main是外键,指的是表主组中的列组名。我的问题是,当我delete from maingroup WHERE groupName= 'dd';在数据库浏览器中尝试()时,它同时删除了父级和子级。但是在QT中,此命令(myQuery.exec("delete from maingroup WHERE groupName= 'dd'");)仅删除主组表中的父字段,而不删除子组和零件表中的子字段,并且子组表中的主列引用主组表中不存在的字段。这怎么了?我该怎么办?
您需要通过在 DELETE 语句之前执行另一条语句来打开外键编译指示。
QSqlQuery q;
q.exec("PRAGMA foreign_keys = ON");
q.exec("DELETE FROM ...");
Run Code Online (Sandbox Code Playgroud)
这能够级联删除,也应该足以解决其他与外键相关的问题。
积分到该forum.qt.io岗位。