2

1,000 万の顧客名があり、それぞれが 1 つ以上の住所に関連付けられており、そのデータを SQL データベースに入れたいとします。

Customer テーブルと Address テーブルを作成します。Customer テーブルには、自動インクリメント主キーが含まれています。各 Address エントリは、外部キーを使用して Customer テーブルを指しています。

ここで、1,000 万件のレコードごとに、Customer レコードを作成し、それを Customer テーブルに挿入し、再度取得して、新しい Address エントリで使用するために割り当てられた自動インクリメント主キーを取得する必要があります。往復で2000万。うーん。

GUID に頼る以外に良い方法はありますか?

(私はたまたま SQLAlchemy で SQLite を使用しています)

4

3 に答える 3

4

これは SA を使用していませんが、Sqlite3 の 2 つのテーブルに行を挿入し、往復を行わないことを示す例です。

2 つのテーブルを結合するビューを作成し、挿入を処理する代わりのトリガーを記述してから、ビューに挿入します。これをさらに進めたい場合は、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 Object Relational Tutorialが、関連する Address を持つ User オブジェクトを作成することによって、このユースケースに直接対処していることに気付くでしょう。OPの実際の問題はもっと複雑だと認識していますが、ORMチュートリアルは始めるのに最適な場所のようです. SA は揺るぎないツールです。

10M の生データ オブジェクトを反復処理する必要があることに注意してください。これは、データベースの一括読み込みツールがより効果的なソリューションになる可能性があることを意味しますが、それは別のアプローチです。

于 2012-07-27T17:54:55.117 に答える
1

これでうまくいくと思います:http://www.sqlite.org/c3ref/last_insert_rowid.html

このルーチンは、最初の引数で、データベース接続からデータベースへの最新の成功した INSERT の行 ID を返します。

表に INTEGER PRIMARY KEY 型の列がある場合、その列は行 ID の別のエイリアスです。

これは C/C++ インターフェイス関数ですが、この関数は SQLite コア関数としても存在します (実際には、C/C++ の単なるラッパーです。http://www.sqlite.org/lang_corefunc.html ) 。

于 2012-07-27T12:57:09.297 に答える