Автоматическое создание операторов вставки для заполнения таблицы соединений в предварительно созданной базе - PullRequest
1 голос
/ 23 сентября 2011

Для простого приложения для Android, которое я создаю как инструмент обучения для себя (для использования реляционных dbs / SQL среди прочего - простите за вопрос, если хотите). Я предварительно создаю базу данных sqlite для поставки вместе с приложением. Я делаю это, основываясь на следующем ТАК вопрос .

У меня есть две таблицы с отношением «многие ко многим» и соединительная таблица для определения этих отношений следующим образом:

CREATE TABLE Names (_id INTEGER PRIMARY KEY,
                    name TEXT
                   );

CREATE TABLE Categories (_id INTEGER PRIMARY KEY,
                         category TEXT
                        );

CREATE TABLE Name_Category (name_id INTEGER,
                            category_id INTEGER,
                            PRIMARY KEY (name_id, category_id),
                            foreign key (name_id) references Names(_id),
                            foreign key (category_id) references Categories(_id) 
                           );


У меня есть наборы операторов вставки для заполнения таблиц имен и категорий. Теперь я столкнулся с задачей заполнения распределительной таблицы. Я уверен, что мог бы создать операторы вставки вручную, посмотрев идентификаторы имен и категорий, которым я хочу соответствовать, но это выглядит немного глупо.

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

У кого-нибудь есть предложения по способам сделать это?

РЕДАКТИРОВАТЬ Я добавил внешние ключи, потому что, как указано ниже, они помогут сохранить целостность между таблицами.

РЕДАКТИРОВАТЬ # 2 Чтобы решить эту проблему, я создал простой сценарий Perl, который берет текстовый файл с парами имя - категория и выгружает их в другой файл с соответствующими операторами SQL.

Текстовый файл имени - категории имеет следующий формат:

'Name' 'Category'


Скрипт Perl выглядит так:

use strict;
use warnings;

open (my $name_category_pair_file, "<", "name_category.txt") or die "Can't open name_category.txt: $!";
open (my $output_sql_file, ">", "load_name_category_junction_table.sqlite") or die "Can't open load_name_category_junction_table.sqlite: $!";

while (<$name_category_pair_file>) {
    if (/('[a-zA-Z ]*') ('[a-zA-Z ]*')/) {
        my $sql_statement = "INSERT INTO Name_Category VALUES (
                             (SELECT _id FROM Names WHERE name = $1),
                             (SELECT _id FROM Categories WHERE category = $2))\;\n\n";

        print $output_sql_file $sql_statement;
    }
}

close $name_category_pair_file or die "$name_category_pair_file: $!";
close $output_sql_file or die "$output_sql_file: $!";

Ответы [ 2 ]

4 голосов
/ 23 сентября 2011

Вы можете использовать эту вставку в своем скрипте или коде (заменяя строки или используя ?):

insert into Name_Category values(
   (select _id from Categories where category='CAT1'),
   (select _id from Names where name='NAME1'));

Кроме того, вы можете изменить таблицу Name_Category для ограничения значений, которые могутбыть вставленным и / или удаленным:

CREATE TABLE Name_Category ( name_id INTEGER NOT NULL,
   category_id INTEGER NOT NULL,
   PRIMARY KEY (name_id, category_id),
   foreign key (name_id) references Names(_id),
   foreign key (category_id) references Categories(_id));
0 голосов
/ 30 сентября 2011

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

Создать триггер для автоматической вставки в таблицу соединений ...

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...