Sqlite FOREIGN KEY ограничение не удалось во время добавления столбца - PullRequest
0 голосов
/ 03 июля 2019

Моя проблема в том, что я получаю ошибку ограничения внешнего ключа при попытке добавить столбец в таблицу.Не строка, а столбец!

Моя таблица называется Screens.У него есть две таблицы с зависимостями внешнего ключа.Они называются Topic и ScreenTypes.Обе таблицы очень маленькие и имеют только 2 столбца (идентификатор и имя).Таблица Screens содержит столбцы TopicId и ScreenTypeId, а также несколько других столбцов.Все три таблицы имеют первичные индексы.Все работало нормально последние несколько недель.

Затем я попытался добавить в таблицу Screens новый столбец с именем ScreenNumber.Новый столбец является числовым и не имеет никаких ограничений.Но когда я попытался зафиксировать изменение в схеме, я получил ошибку ограничения внешнего ключа.

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

Любая помощь будет принята с благодарностью!Я понятия не имею, что является причиной этого, и я истек крайний срок для этого проекта.

1 Ответ

1 голос
/ 03 июля 2019

Моя таблица называется Screens. Имеет две таблицы с внешним ключом зависимостей. Они называются Topic и ScreenTypes. Обе таблицы очень маленький, и у них есть только 2 столбца (идентификатор и имя). Таблица Screens содержит столбцы TopicId и ScreenTypeId, а также пара других столбцов. Все три таблицы имеют первичные индексы. За последние несколько недель все работало нормально.

Исходя из вышеизложенного и ваших комментариев, это выглядит так, чтобы создать таблицу Screens, таблицу Topics и таблицу ScreenTypes и дополнительно заполнить таблицы некоторыми данными: -

DROP TABLE IF EXISTS Screens;
CREATE TABLE IF NOT EXISTS Screens (
    id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE, 
    Video TEXT NOT NULL, 
    TopicId INTEGER NOT NULL, 
    Instructions TEXT, 
    ScreenTypeId INTEGER, 
    SortOrder INTEGER DEFAULT (10), 
    Image TEXT, 
    NewColumn INTEGER, 
    FOREIGN KEY (TopicId) REFERENCES Topics (id), 
    FOREIGN KEY (ScreenTypeId) REFERENCES ScreenTypes (id)
    )
;

DROP TABLE IF EXISTS Topics;
CREATE TABLE IF NOT EXISTS Topics (ID INTEGER PRIMARY KEY, name TEXT);
DROP TABLE IF EXISTS ScreenTypes;
CREATE TABLE IF NOT EXISTS ScreenTypes (ID INTEGER PRIMARY KEY, name TEXT);

INSERT INTO Topics (name) VALUES ('Topic1'),('Topic2'),('Topic3'),('Topic4');
INSERT INTO ScreenTypes (name) VALUES ('SreenType1'),('ScreenType2'),('ScreenType3'),('ScreenType4');
INSERT INTO Screens (Video,TopicId,Instructions,ScreenTypeId,Image,NewColumn) VALUES
    ('Video1',2,'do this 001',3,'Image1','blah'),
    ('Video2',2,'do this 002',3,'Image2','blah'),
    ('Video3',1,'do this 002',1,'Image3','blah'),
    ('Video4',3,'do this 004',4,'Image4','blah'),
    ('Video5',4,'do this 005',1,'Image5','blah')
;

Затем я попытался добавить в таблицу Screens новый столбец с именем ScreenNumber. Новый столбец числовой и не имеет ограничений бы то ни было. Но когда я попытался зафиксировать изменение в схеме, я получена ошибка ограничения внешнего ключа.

Следующие работы: -

ALTER TABLE Screens ADD COLUMN ScreenNumber INTEGER DEFAULT 100;

согласно: -

  ALTER TABLE Screens ADD COLUMN ScreenNumber INTEGER DEFAULT 100
  OK
  Time: 0.083s

, а затем с помощью следующего

SELECT * FROM Screens;

Результат: -

enter image description here

  • Как видно, конфликтов ограничений FK не было, столбец добавлен и применено значение по умолчанию 100.

Я подозреваю, что ваши проблемы с FK Constraints заключаются в том, что вы постепенно пытаетесь исправить проблемы.

Сначала (предположительно) вы пытаетесь изменить (переименовать) таблицу Screens, но не можете, поскольку ограничение Fk конфликтует с таблицей Fields. Затем вы пытаетесь изменить таблицу полей, но при этом у вас возникают конфликты FK из-за: -

Если команда «ALTER TABLE ... RENAME TO» используется для переименования таблицы, которая является родительской таблицей одного или нескольких ограничений внешнего ключа, определения ограничений внешнего ключа изменяются для ссылки на родительскую таблицу с помощью его новое имя. Текст дочернего оператора CREATE TABLE или операторов, хранящихся в таблице sqlite_master, изменен, чтобы отразить новое имя родительской таблицы.

Поддержка внешнего ключа SQLite - 5. Команды CREATE, ALTER и DROP TABLE

Конечно, если согласно вашему описанию вы хотите добавить только столбец, тогда ALTER TABLE Screens ADD COLUMN ScreenNumber INTEGER (со значением по умолчанию, если требуется) работает без необходимости переименовывать таблицы.

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