自动创建插入语句以填充预创建的数据库中的连接表

时间:2011-09-23 00:59:08

标签: android perl sqlite

对于一个简单的Android应用程序,我正在为自己创建一个教学工具(使用关系dbs / SQL等等 - 请原谅问题的简单性,如果你愿意的话)。我正在预先创建一个sqlite db以随应用程序一起提供。我这样做是基于以下SO question

我有两个具有多对多关系的表和一个用于定义这些关系的联结表,如下所示:

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


我有一组插入语句来填充名称和类别表。我现在面临着填充连接表的任务。我确信我可以手工创建插入语句,查找我想要匹配的名称和类别的ID,但这看起来有点傻。

为了自动为联结表创建插入语句,我想我可以创建一个基于一组名称和类别对的脚本,它们将搜索相应的id并转储insert语句。 (当我提出这个问题时,我想出了这个问题,并会对它进行研究。当发生这种情况时,你不喜欢它吗?)

有没有人建议如何做到这一点?

编辑我添加了外键,因为如下所述,它们有助于维护表之间的完整性。

编辑#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 个答案:

答案 0 :(得分:4)

您可以在脚本或代码中使用此插入内容(替换字符串或使用?):

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

答案 1 :(得分:0)

首先创建两个主表,然后创建一个联结表,其中两个主表的主键将作为外键使用。联结表的主键将是联合 第一和第二主表的主键

立即创建触发器以自动插入联结表...

另外,不要忘记创建具有级联删除和级联更新的表,以便在主表中更新或删除的任何值将自动反映在联结表中