Добавление значений в базу данных, но ограничение внешнего ключа не удалось - PullRequest
0 голосов
/ 19 октября 2018

Я новичок в sqlite3 и не очень разбираюсь в внешних ключах.Я пытался вставить данные для пользователя:

вставить в User (User_id, name) значения (201503426, «Джон Доу»);

Но после запускаэто, я получил foreign key constraint failed сообщение.

Итак, у меня есть три таблицы:

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`)
);

CREATE TABLE `Spot` (
`spot_id`   integer,
`user_id`   text DEFAULT 'vacant',
`order_id`  integer DEFAULT 0,
`status`    integer DEFAULT 0,
FOREIGN KEY(`order_id`) REFERENCES `Orderr`(`order_id`),
FOREIGN KEY(`user_id`) REFERENCES `User`(`User_id`),
PRIMARY KEY(`spot_id`)
);

CREATE TABLE `Orderr` (
`order_id`  integer,
`user_id`   text DEFAULT 'user',
`spot_number`   integer DEFAULT 0,
`amount_due`    integer DEFAULT 0,
`time_lapse`    integer DEFAULT 0,
PRIMARY KEY(`order_id`),
FOREIGN KEY(`user_id`) REFERENCES `User`(`User_id`),
FOREIGN KEY(`spot_number`) REFERENCES `Spot`(`spot_id`)
);

Как я могу добавить значения без получения ошибки?.

1 Ответ

0 голосов
/ 19 октября 2018

Вот оператор 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 (как и некоторые другие), следовательно, будет вставлено значение по умолчанию .Таким образом, ваша вставка приведет к добавлению следующей записи:

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

Теперь, поскольку у вас есть ограничения внешнего ключа на order_id и spot_number, SQLite проверит, чтобы убедиться, что соответствующиетаблицы на самом деле имеют записи, соответствующие вставленной вами записи.Я предполагаю, что такие записи не существуют, поэтому вы видите эту ошибку.

Есть несколько способов исправить это, но я бы предложил сразу изменить не использовать значения по умолчанию для столбцов внешнего ключа.Вместо этого позвольте им быть NULL.Таким образом, вы можете выполнить текущую вставку, и вместо этого вы получите следующую запись:

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

SQLite позволит столбцу внешнего ключа иметь значение NULL и не указывать на его родителя.Таблица.Это позволит вам заполнить пробелы позже, возможно, когда у вас будет эта информация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...