2

假设我有 1000 万个客户名称,每个名称都与一个或多个地址相关联,并且我想将数据放入 SQL 数据库中。

我制作了一个客户表和一个地址表。Customer 表包含一个自动增量主键。每个地址条目都指向带有外键的客户表。

现在,对于 1000 万条记录中的每一条,我必须创建一条 Customer 记录,将其插入到 Customer 表中,然后再次检索它以获得分配给它的自动增量主键,以便在新的 Address 条目中使用。2000 万次往返。啊。

除了使用 GUID 之外,还有更好的方法吗?

(我碰巧将 SQLite 与 SQLAlchemy 一起使用)

4

3 回答 3

4

这不是使用 SA,而是一个示例来说明在 Sqlite3 中的两个表中插入行并且不进行往返。

创建一个连接两个表的视图,然后编写一个代替触发器来处理插入,然后插入到您的视图中。如果您想更进一步,修改 SA 以插入您的视图应该不难。

create table customer (id integer primary key autoincrement, name text not null);

create table address (id integer primary key autoincrement, customer_id integer references customer not null, street text);

create view customer_view as 
select customer.id as customer_id, customer.name, address.id as address_id, address.street
from customer 
inner join address on customer.id = address.id;

create trigger customer_view_insert_trg
instead of insert on customer_view begin
insert into customer (name) values (new.name);
insert into address (customer_id, street) values ((select last_insert_rowid()), new.street);
end;

insert into customer_view (name, street) values ('Joe', 'Main Street');
insert into customer_view (name, street) values ('Bill', 'Water Street');

sqlite> select * from customer;
1|Joe
2|Bill

sqlite> select * from address;
1|1|Main Street
2|2|Water Street
于 2012-07-30T05:44:29.033 回答
3

如果将 Customer 和 Address 对象配置为在它们之间建立关系,则可以简单地插入它们而无需担心 ID。SA 知道它们是相关的,并为您制定 FK 详细信息。

细心的读者会注意到 SA 对象关系教程通过创建具有相关 Address 的 User 对象直接解决了这个用例。我认识到 OP 的实际问题更复杂,但 ORM 教程似乎是一个很好的起点。SA 是一个摇滚工具。

请注意,您仍然需要迭代 10M 原始数据对象,这可能意味着您的数据库的批量加载工具可能是更有效的解决方案,但这是一种不同的方法。

于 2012-07-27T17:54:55.117 回答
1

我认为应该这样做:http ://www.sqlite.org/c3ref/last_insert_rowid.html

此例程从第一个参数中的数据库连接返回最近成功 INSERT 到数据库中的 rowid。

如果表具有 INTEGER PRIMARY KEY 类型的列,则该列是 rowid 的另一个别名。

虽然这是一个 C/C++ 接口函数,但该函数也作为 SQLite 核心函数存在(实际上,它只是 C/C++ 的一个包装器。http://www.sqlite.org/lang_corefunc.html

于 2012-07-27T12:57:09.297 回答