对于一个简单的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: $!";
答案 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)
首先创建两个主表,然后创建一个联结表,其中两个主表的主键将作为外键使用。联结表的主键将是联合 第一和第二主表的主键。
立即创建触发器以自动插入联结表...
另外,不要忘记创建具有级联删除和级联更新的表,以便在主表中更新或删除的任何值将自动反映在联结表中