2

自動インクリメントの代理キーを持つテーブルがあります。他のテーブルの外部キーとして使用したい。問題は、参照する必要があるもの(代理キーの実際の値)を判別することがほぼ不可能であるため、そのテーブルを参照する方法がわからないことです。

私がやろうとしているのは、私のプログラム(dbmsの外)を介してタプル/レコードを追加することであることに注意してください。プロセスは次のとおりです。

  1. Table1に新しいレコードを追加し、自動インクリメントキーを生成します。アップデート

  2. Table2に新しいレコードを追加し、その外部キーをTable1の主キーに参照します。アップデート

私の質問は次のとおりです。外部キーが何であるかわからなかった場合、どのように外部キーを保存しますか?

編集:

データベースを指定せず、長い返信をしてすみません。私はマイクロソフトSQLサーバーを使用しています。

4

2 に答える 2

1

データベースソフトウェアの名前について言及しておらず、問題は代理キーの宣言方法ではないように思われるため、次のことができます。

  1. 表1の表2の外部キーをNULL可能として設定します。これにより、表2のレコードのキーが決定された後で更新できるようになります。
  2. 最初に表2のレコードを保存してから、表2に新しく保存されたレコードを参照する表1のレコードを保存します。このように、表1の表2への外部キーをNULL可能として宣言する必要はありません。これを行うための好ましい方法です。
于 2012-06-02T22:23:08.317 に答える
1

DBMSがシーケンスをサポートしている場合(最新のDBMSがサポートしている)、table1のPK値を生成し、DBMSの「currval」機能を使用してそのFK値を参照します。

(PostgreSQL構文ですが、他のDBMSサポートシーケンスには非常によく似た機能があります):

INSERT INTO table1 (id, col1, col2) 
VALUES (nextval('id_sequence'), 'foo', 'bar');

INSERT INTO table2 (t1_id, col1)
VALUES (currval('id_sequence'), 'foobar');

もう1つのオプションは、プログラムでID値を取得し、その値を両方の挿入で使用することです。

シーケンスをサポートしないDBMS(2012年より前のMySQLやSQL Serverなど)を処理する必要がある場合は、通常@@IDENTITY、2番目のINSERTステートメントでtable1の生成されたID値を参照できる関数(SQL Serverなど)があります(代わりに)現在の呼び出しの)

于 2012-06-02T22:30:21.433 に答える