【问题标题】:SQLite importing data from a datadump script including primary and foreign keysSQLite 从数据转储脚本导入数据,包括主键和外键
【发布时间】:2011-03-09 08:32:58
【问题描述】:

我有一个使用外键的 SQLite 数据库,其中一些是自动递增的值。系统表示的“核心”数据例如是汽车。例如,外键链接到有关车轮和轮胎的信息,我希望从一个数据库中导出 n 辆汽车并导入到另一个数据库中。

我想通过编写一组可以被导入数据库加载的sql语句(即一堆插入语句)来做到这一点,但是转储数据中的键值不一定与现有数据匹配(可能某些键值有重复项)。

解决这个问题的最佳方法是什么?是否有一种简单或推荐的方法来编写导入脚本,以便删除对导出键值的依赖?

在下面的示例中,汽车索引将命名汽车。 CarPartColours 链接单个零件并带有颜色定义。 CarPartColours 中会有多行具有相同的 CarID。 当用户在 carindex 中选择一行时,我希望从 carpartcolours、carindex、parts 和 colors 中导出所有相关行,然后导入另一个数据库。该数据库中的颜色定义可能是重复的(另一个不同的问题)或具有与原始数据库中相同的键值。

 CREATE TABLE carindex (
  ID    integer PRIMARY KEY NOT NULL,
  Name  varchar(50)
);

CREATE TABLE carpartcolours (
  ID        integer PRIMARY KEY AUTOINCREMENT NOT NULL,
  CarID     integer,
  PartID    integer,
  ColourID  integer,
  /* Foreign keys */
  FOREIGN KEY (CarID)
    REFERENCES carindex(ID)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION, 
  FOREIGN KEY (PartID)
    REFERENCES parts(ID)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION, 
  FOREIGN KEY (ColourID)
    REFERENCES colours(ID)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
);

CREATE TABLE colours (
  ID    integer PRIMARY KEY AUTOINCREMENT NOT NULL,
  Name  varchar(50),
  R     real,
  G     real,
  B     real
);

CREATE TABLE parts (
  ID            integer PRIMARY KEY AUTOINCREMENT NOT NULL,
  Name          varchar(50),
  Value         real,
  Manufacturer  varchar(50)
);

【问题讨论】:

    标签: sql sqlite export key dump


    【解决方案1】:

    @Mike 我之前发布了一个答案,之前我的思路完全错误,所以我重新开始。我很抱歉。

    我会说您需要确保查看数据库主从复制,因为这就是您正在尝试做的事情。您想将数据从从站复制到主站。由于您不知道何时将哪个插入到何处,因此您需要寻找无冲突的密钥(或尝试无冲突的东西)。因此,因为您可以在任何一个数据库中生成一条记录,并且您可以将该记录迁移到任何其他数据库,所以您想要生成一个 UUID 样式的键,并使用它来代替 INT AUTOINCREMENT。

    这是进行跨数据库数据复制的唯一方法。

    否则,您只想最后插入carpartcolours

    抱歉,回答您的问题延迟...

    【讨论】:

    • 谢谢。我认为这是前进的方向。使用 guid 作为主键使转储和重新导入值变得简单。
    【解决方案2】:

    尝试将所有插入语句包装到事务中:

    BEGIN TRANSACTION
    // all your inserts go here
    END TRANSACTION
    

    【讨论】:

      【解决方案3】:

      我对 sqlite 本身并不熟悉,但我过去遇到类似问题的做法是:

      • 从原始数据库中转储数据,包括主键和外键值
      • 关闭目标数据库中的自动增量行为
      • 导入数据
      • 重新开启自动增量行为

      这在 sqlite 中可能是不可能的,或者可能因为您有具有相同主键的预先存在的数据而无法工作。

      在这种情况下,您可以将原始数据库中的数据导入临时表,然后编写脚本以使用手写 SQL 将其导入目标数据库,从依赖链的“最远”端开始。不过相当费力。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-12-21
        • 1970-01-01
        • 2012-10-02
        • 2022-01-27
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        相关资源
        最近更新 更多