powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Ошибка с каскадным удалением.
2 сообщений из 2, страница 1 из 1
Ошибка с каскадным удалением.
    #39205590
Klironce
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сушествует база данных, в ней 4 таблицы
Users UserPlaces Places UserAccounts
Как отсюда следует поле User.Id = UserPlaces.UserId = UserAccounts.UserId

Допустим потребовалось добавить guid таблицы. Так как поле уникальное то его нельзя просто добавить alter-ом.

Создается новая таблица newUsers с новым полем.
Туда записываются все данные из Users , заполняется guid, а затем следующий код.

Код: plaintext
1.
2.
3.
PRAGMA foreign_keys = off
DROP TABLE Users;
ALTER TABLE newUsers RENAME TO Users;
PRAGMA foreign_keys = on;

По идеи мы отключаем каскадные удаления и изменения, дропаем безболезнено таблицу и подменяем её другой.

Так вот.
Такая штука прокатывает не везде.
если я использую SqliteBrowser - то он вообще не дает в пределах сессии включить foregin_keys, более того, они всегда off, false, 0
Но при этом все таблицы замещаются и все хорошо.

Как только я использую к примеру библиотеку на c# Sqlite.dll,
то в не происходит каскадная очистка связующих таблиц ( при этом новая таблица с данными переименовывается и даже видит зависимости. ИМХО.

Не хочется изобретать велосипед, ведь это лишь пример а в реальной базе там 40-50 связующих таблиц и каждую переделывать не вариант ( ну совсем грустный вариант )


Так вот подскажите, кто сталкивался с данной проблемой.

От себя скажу, что разница в шрифте роль не играет Users и users эквивалентны. Хотя я грешил на то, что переменные названы из за того что два разных программиста писали UserId = userId = userid - но от перемены ничего не изменилось.
...
Рейтинг: 0 / 0
Ошибка с каскадным удалением.
    #39205592
Klironce
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Klironce,

Данные заполните любые.

Скриптик
CREATE TABLE Users
(
Id INTEGER PRIMARY KEY AUTOINCREMENT,
UserId INTEGER NOT NULL UNIQUE,
FirstName TEXT,
MiddleName TEXT,
LastName TEXT
);

CREATE TABLE IF NOT EXISTS usercards(
id INTEGER PRIMARY KEY AUTOINCREMENT,
userid INTEGER NOT NULL,
rfid TEXT NOT NULL,

FOREIGN KEY(userid)
REFERENCES users(userid)
ON UPDATE CASCADE
ON DELETE CASCADE
);

CREATE TABLE newUsers
(
Id INTEGER PRIMARY KEY AUTOINCREMENT,
UserId INTEGER NOT NULL UNIQUE,
FirstName TEXT,
MiddleName TEXT,
LastName TEXT,
Guid TEXT NOT NULL UNIQUE
);

INSERT INTO newUsers(userid, firstname, middlename, lastname, guid)
SELECT userid, firstname, middlename, lastname, (lower(hex(randomblob(16)))) from users;

PRAGMA foreign_keys = off
DROP TABLE Users;
ALTER TABLE newUsers RENAME TO Users;
PRAGMA foreign_keys = on;
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Ошибка с каскадным удалением.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]