首页 > 解决方案 > 没有从 NodeJS / JavaScript 触发 SQLite FOREIGN KEY 约束

问题描述

我正在尝试创建一个 POST 路由,如下所示。我的 Timesheet 表有一个 FOREIGN KEY 约束集,它引用了 Employee 表。当我尝试使用 DB Browser 插入不存在的员工的时间表时,我得到了由约束触发的正确错误。但是,当我运行下面的代码时,它会忽略此约束并插入记录。我是否设置不正确,或者在这种情况下这不是有效的约束?

timesheetRouter.post("/", getParams, (req, res, next) => {
    const tsData = req.body.timesheet;
    console.log("ID", req.empID);
    db.run(`insert into Timesheet (hours, rate, date, employee_id) 
        values ($hours, $rate, $date, $emp);`, {
        $hours: tsData.hours,
        $rate: tsData.rate,
        $date: tsData.date,
        $emp: req.empID
    }, function(err) {
        if (err) {
            return res.status(404).send(err);
        } else {
            db.get("select * from Timesheet where id = $id", {$id: this.lastID},
                (err, row) => {
                    return res.status(201).send({timesheet: row});
                });
        }
    });
});

建表代码:

db.serialize(() => {
    db.run("DROP TABLE IF EXISTS Timesheet", err => {
        if (err) {
            throw new Error(err);
        }
    });
    db.run(`create table Timesheet (id integer PRIMARY KEY,
        hours integer NOT NULL,
        rate integer NOT NULL,
        date integer NOT NULL,
        employee_id integer NOT NULL, FOREIGN KEY (employee_id) REFERENCES Employee (id))`,
    err => {
        if (err) {
            throw new Error(err);
        }
    });
});

注意:getParams 是一个确定 empID 值的函数。

标签: javascriptnode.jssqliteforeign-keys

解决方案


目前,在 SQLite 版本 3.25.2中,默认情况下禁用外键约束。您需要通过以下方式打开它们

sqlite> PRAGMA foreign_keys = ON;

或者,在你的情况下

db.get("PRAGMA foreign_keys = ON")

我假设。

它在每个连接的基础上工作,DB Browser 可能会在启动时自动设置它,这就是它在这种情况下触发错误的原因。


推荐阅读