SQLite从包含主键和外键的datadump脚本导入数据

时间:2011-03-09 08:32:58

标签: sql sqlite export key dump

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

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

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

在下面的示例中,carindex将命名汽车。 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)
);

3 个答案:

答案 0 :(得分:0)

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

BEGIN TRANSACTION
// all your inserts go here
END TRANSACTION

答案 1 :(得分:0)

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

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

这在sqlite中可能无法实现,或者可能无效,因为您已预先存在具有相同主键的数据。

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

答案 2 :(得分:0)

@Mike我发布了一个上一个答案,之前我的思路完全错了,所以我开始新鲜了。道歉。

我想说你需要确保你查看数据库主从复制,因为这是你想要做的。您希望将数据从从站复制到主站。既然你不知道哪里插入了哪个,那么你需要寻找一个无碰撞的密钥(或尝试一些无碰撞的东西)。因此,您可以在任何一个数据库中生成记录,并且可以将该记录迁移到任何其他数据库,然后您希望生成UUID样式密钥,并使用它来代替INT AUTOINCREMENT。

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

否则,您只想最后插入carpartcolours

对于延迟回答你的问题感到抱歉......