向数据库添加值,但外键约束失败

时间:2018-10-19 06:39:28

标签: sqlite

我是sqlite3的新手,对外键的了解也不多。我试图向用户插入数据:

插入<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>files</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> </head> <body> <script> // Check for the various File API support. if (window.File && window.FileReader && window.FileList && window.Blob) { // Great success! All the File APIs are supported. } else { alert('The File APIs are not fully supported in this browser.'); } </script> </body> </html> UserUser_id)值中(201503426,'John Doe');

但是运行它后,我收到了name消息。

所以我有三个表:

foreign key constraint failed

如何在不出错的情况下添加值?

1 个答案:

答案 0 :(得分:1)

这是CREATE TABLE表的User语句:

CREATE TABLE User (
    User_id integer,
    plate_number integer DEFAULT 0,
    name text DEFAULT 'user',
    spot_number integer DEFAULT 0,
    credit integer DEFAULT 0,
    order_id integer DEFAULT 0,
    FOREIGN KEY(order_id) REFERENCES Orderr(order_id),
    FOREIGN KEY(spot_number) REFERENCES Spot(spot_id),
    PRIMARY KEY(User_id)
);

在这里重要的是,对于User_id以外的所有列,您都定义了默认的非NULL值。现在考虑您的插入语句:

INSERT INTO User (User_id, name)
VALUES
    (201503426, 'John Doe');

因为您没有指定order_id列(以及其他几个列),所以将插入 default 值。因此,您的插入将导致添加以下记录:

(User_id,   plate_number, name,       spot_number, credit, order_id)
(201503426, 0,            'John Doe', 0,           0,      0)

现在,由于在order_idspot_number上有外键约束,SQLite将检查以确保那些相应的表实际上具有与您插入的记录相对应的整体。我的猜测是这样的记录不存在,这就是为什么您看到此错误的原因。

有几种方法可以解决此问题,但是我建议立即更改为为外键列使用默认值。而是让它们成为NULL。这样,您可以执行当前的插入操作,而最终得到以下记录:

(User_id,   plate_number, name,       spot_number, credit, order_id)
(201503426, NULL,         'John Doe', NULL,        NULL,   NULL)

SQLite将允许外键列带有NULL值,而不指向其父表。这样一来,您便可以在以后(可能是在您拥有该信息的情况下)填写空白。