Как переместить столбец из ссылочной таблицы в таблицу ссылок, используя только диалект языка SQLite? - PullRequest
0 голосов
/ 10 марта 2020

У меня есть следующая структура таблицы в базе данных SQLite:

    CREATE TABLE A (id integer primary key, name text, room Integer);
    CREATE TABLE B (id integer primary key, idA integer not null, code blob, FOREIGN KEY(idA) REFERENCES A(id));

Для каждой записи в A есть от 1 до n записей в B, которые ссылаются на нее. Желаемая структура таблицы:

    CREATE TABLE A (id integer primary key, name text);
    CREATE TABLE B (id integer primary key, idA integer not null, code blob, room Integer, FOREIGN KEY(idA) REFERENCES A(id));

Итак, я бы хотел перенести столбец комнаты из А в В без потери данных: пересоздать таблицу А без столбца комнаты, удалить дубликаты из А, добавить столбец комнаты в В, установить это зависит от того, какие значения были в столбцах комнаты записей A, на которые есть ссылки (исходная таблица A), и переназначить idA для записей B.

Возможно ли использовать только SQLite, и если да, то как это сделать, используя только SQLite?

Спасибо!

1 Ответ

0 голосов
/ 10 марта 2020

посмотрите на http://sqlfiddle.com/#! 5 / e26e2 / 1 .

при создании баз данных:

CREATE TABLE A (id integer primary key, name text, room Integer);
CREATE TABLE B (id integer primary key, idA integer not null, code blob, FOREIGN KEY(idA) REFERENCES A(id));

Заполните некоторые тестовые данные:

insert into A (id, name, room) values (1, "azerty", 123) ;
insert into A (id, name, room) values (2, "querty", 456) ;

insert into B (id, idA, code) values (10, 1, "code 1") ;
insert into B (id, idA, code) values (15, 1, "code 1b") ;
insert into B (id, idA, code) values (20, 1, "code 1c") ;
insert into B (id, idA, code) values (25, 2, "code 2") ;
insert into B (id, idA, code) values (30, 3, "code 3") ;

скопировать неправильные макеты таблиц в таблицы, которые мы позже отбросим:

alter table B rename to old_B ;
alter table A rename to old_A ;

Создать таблицы в соответствии с правильной компоновкой:

CREATE TABLE A (id integer primary key, name text);
CREATE TABLE B (id integer primary key, idA integer not null, code blob, room Integer, FOREIGN KEY(idA) REFERENCES A(id));

Скопировать выбранные данные из old_A в A:

INSERT OR REPLACE INTO A ( id, name)
SELECT id, name FROM old_A ;

заполнить B внутренним соединением, чтобы "выстроить" комнату с правильным idA:

INSERT OR REPLACE INTO B ( id, idA, code, room)
SELECT old_B.*, old_A.room FROM old_B INNER JOIN old_A ON old_B.idA = old_A.id  ;   

удалить старые таблицы

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