SQLite импортирует данные из скрипта данных, включая первичные и внешние ключи - PullRequest
1 голос
/ 09 марта 2011

У меня есть база данных SQLite, которая использует внешние ключи, некоторые из которых будут автоматически инкрементированными значениями. «Основные» данные, которые система представляет, например, автомобиль. Например, внешние ключи связаны с информацией о колесах и шинах, и я хочу экспортировать n автомобилей из одной базы данных и импортировать в другую.

Я хочу сделать это, написав набор операторов sql (т.е. набор операторов вставки), которые могут быть загружены импортирующей базой данных, но значения ключей в выгруженных данных не обязательно будут совпадать с существующими данными ( возможно есть дубликаты в некоторых ключевых значениях).

Как лучше всего с этим справиться? Существует ли простой или рекомендуемый способ написания сценария импорта, чтобы удалить зависимости от экспортируемых значений ключей?

В приведенном ниже примере carindex будет называть автомобиль. CarPartColours связывает одну деталь с определением цвета. В CarPartColours будет несколько строк с одним и тем же CarID. Я хочу экспортировать все соответствующие строки из carpartcolours, carindex, деталей и цветов, когда пользователь выбирает одну строку в carindex, и импортировать в другую базу данных. Определения цвета в этой базе данных могут быть дубликатами (другая проблема) или иметь те же значения ключей, что и в исходной базе данных.

 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 голосов
/ 09 марта 2011

Я не знаком с sqlite как таковым, но в прошлом я сталкивался с подобными проблемами:

  • выгрузка данных из исходной базы данных, включая значения первичного и внешнего ключей
  • отключить режим автоинкремента в целевой базе данных
  • импортировать данные
  • снова включить режим автоинкремента

Это может быть невозможно в sqliteили может не работать, потому что у вас есть уже существующие данные с теми же первичными ключами.

В этом случае вы можете импортировать данные из исходной базы данных во временные таблицы, а затем написать сценарии для импорта их вцелевая база данных с рукописным SQL, начиная с самого дальнего конца цепочки зависимостей.Впрочем, довольно трудоемко.

0 голосов
/ 20 марта 2011

@ Майк Я опубликовал предыдущий ответ, и раньше у меня были совершенно неверные мысли, поэтому я начинаю с нуля.Мои извинения.

Я бы сказал, что вам нужно убедиться, что вы изучаете репликацию главного и подчиненного баз данных, поскольку именно это вы и пытаетесь сделать.Вы хотите скопировать данные от ведомого к ведущему.Так как вы не будете знать, куда и когда вставлен, вам нужно искать ключ без столкновений (или пытаться найти что-то без столкновений).Таким образом, поскольку вы можете сгенерировать запись в любой одной базе данных и перенести эту запись в любую другую базу данных, вы хотите сгенерировать ключ стиля UUID и использовать его вместо INT AUTOINCREMENT.

Это единственный способ выполнить кросс-репликацию данных базы данных.

В противном случае вы просто хотите вставить в carpartcolours last.

Извините за задержку с ответом на вашвопрос ...

0 голосов
/ 09 марта 2011

Попробуйте обернуть все ваши операторы вставки в транзакцию:

BEGIN TRANSACTION
// all your inserts go here
END TRANSACTION
...