【问题标题】:SQLLITE move column and its data from TableA to TableBSQLITE 将列及其数据从表移动到表
【发布时间】:2019-10-11 05:23:27
【问题描述】:

下面有两张桌子

table_a 包含列(id、table_bId、name、address、postcode、allowedPermisions)

table_b 包含列(id、type、level、info)

我想创建一个迁移策略,因为我们现在应该将 allowedPermissions 数据存储在 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 之后出现语法错误,(在此处看到一个示例说您可以更新多个表?)

然后我尝试了另一种方法,使用

创建新列 allowedPermissions
ALTER TABLE table_b
ADD COLUMN allowedPermissions TEXT

但是如何将table_a中allowedPermissions的内容复制到sqlite中的table_b?

【问题讨论】:

    标签: android sqlite android-sqlite database-migration android-room


    【解决方案1】:

    回答

    我相信更新会是:-

    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;
    

    table_a

    中删除多余的 allowedPermisions

    示例

    考虑以下演示:-

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

    示例结果

    第一个结果(alter和update之前的table_b):-

    第二个结果(alter和update后的table_b):-

    • 第三行是孤儿(有意),因此为 NULL

    第三个结果(table_a 没有 allowedPermisions 列):-

    【讨论】:

    • 非常感谢。我会尝试这些建议。谢谢!
    • 有点工作,但它没有复制外键约束
    • @jonney 真的吗?它完成了您在问题中指定的所有内容。
    • 我的生产级表有外键约束,指定了级联等内容。我想我必须编写 ftrkuh) 外键约束作为创建表语句的一部分
    • @jonney 是的,除非您从表的 sqlite_master 的 sql 列中提取和操作 sql,并且 BUT 房间不允许您这样做,所以您d 必须在通过从非房间 SDK 打开 SQliteDatabase 来构建 RoomDatabase 之前执行此操作。但是,我不认为值得付出这样的努力,因为操作可能很尴尬。
    猜你喜欢
    • 1970-01-01
    • 2019-06-08
    • 2012-09-17
    • 1970-01-01
    • 2017-04-20
    • 2018-05-23
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多