SQLLITE переместить столбец и его данные из таблицы A в таблицу B - PullRequest
0 голосов
/ 24 мая 2019

у меня есть две таблицы ниже

table_a со столбцами (id, table_bId, имя, адрес, почтовый индекс, позволенные разрешения)

таблица_b со столбцами (идентификатор, тип, уровень, информация)

Я хочу создать стратегию миграции, поскольку теперь мы должны хранить вместо нее данные allowPermissions в table_b

Вот что я попробовал:

UPDATE table_a, table_b
SET table_a.allowedPermissions = table_b.allowedPermissions 
WHERE table_b.id=table_a.table_bId;

Я получаю синтаксическую ошибку после UPDATE table_a (здесь приведен пример, где можно обновить несколько таблиц?)

Затем я попробовал другой подход, создав новый столбец allowPermissions с использованием

ALTER TABLE table_b
ADD COLUMN allowedPermissions TEXT

Но как мне скопировать содержимое allowPermissions в table_a в table_b в sqlite?

1 Ответ

0 голосов
/ 24 мая 2019

Ответ

Я считаю, что обновление будет: -

UPDATE table_b SET allowedPermissions = (SELECT allowedPermisions FROM table_a WHERE table_a.table_bId = table_b.id);

Дополнительно

Тогда вы можете использовать: -

CREATE TABLE IF NOT EXISTS table_a_copy  AS  SELECT id, table_bId, name, address, postcode FROM table_a;
ALTER TABLE table_a RENAME TO table_a_old;
ALTER TABLE table_a_copy RENAME TO table_a;
DROP TABLE IF EXISTS table_a_old;

Чтобы удалить лишний столбец allowPermisions из table_a

Пример

Рассмотрим следующую демонстрацию: -

-- Create the original tables
DROP TABLE IF EXISTS table_a;
DROP TABLE IF EXISTS table_b;
CREATE TABLE IF NOT EXISTS table_a (id INTEGER PRIMARY KEY, table_bId INTEGER, name TEXT, address TEXT, postcode TEXT, allowedPermisions TEXT);
CREATE TABLE IF NOT EXISTS table_b (id INTEGER PRIMARY KEY, type TEXT, level INTEGER, info TEXT);

-- Populate the original tables
INSERT INTO table_b (type,level,info) VALUES
    ('TYEPA',1,'BLAH A'),('TYEPB',2,'BLAH B'),('TYEPC',1,'BLAH ')
;

INSERT INTO table_a (table_bId, name, address, postcode, allowedPermisions) VALUES
  (1,'Name A','ADDRESS A','OX120ND','READ'),
    (1,'Name M','ADDRESS M','SW050ND','READ'),
  (1,'Name X','ADDRESS X','FA120ND','READ'),
    (2,'Name Z','ADDRESS Z','OX120ND','WRITE')
;

-- Show what table_b looks like before the alter and update
SELECT * FROM table_b;

-- Alter an update table_b
ALTER TABLE table_b ADD COLUMN allowedPermissions;
UPDATE table_b SET allowedPermissions = (SELECT allowedPermisions FROM table_a WHERE table_a.table_bId = table_b.id);

-- Show what table_b looks like after the alter and update
SELECT * FROM table_b;

-- Clean up table_a (remove the allowdPermisions column)
DROP TABLE IF EXISTS table_a_copy;
CREATE TABLE IF NOT EXISTS table_a_copy  AS  SELECT id, table_bId, name, address, postcode FROM table_a;
ALTER TABLE table_a RENAME TO table_a_old;
ALTER TABLE table_a_copy RENAME TO table_a;
DROP TABLE IF EXISTS table_a_old;
SELECT * FROM table_a;

Пример результата

Первый результат (таблица_b перед изменением и обновлением): -

enter image description here

Второй результат (table_b после изменения и обновления): -

enter image description here

  • 3-я строка - сирота (намеренно), следовательно, NULL

Третий результат (таблица_a без столбца allowPermisions): -

enter image description here

...