1

jdbcを使用して挿入する2つのテーブルがあります。たとえばparcelsTablefilesTableそして私にはいくつかのケースがあります:
1.両方のテーブルに新しい行を挿入します。
2. にのみ新しい行を挿入しparcelsTableます。

表:

DROP parcelsTable;
CREATE TABLE(
 num serial PRIMARY KEY,
 parcel_name text,
 filestock_id integer
)


DROP filesTable;
CREATE TABLE(
 num serial PRIMARY KEY,
 file_name text,
 files bytea
)

parcelsTable.filestock_id=filesTable.numTRIGGERを使用して両方のテーブルにINSERTがあるときに設定したい。
それが可能だ?両方のテーブルに挿入したことを知るにはどうすればよいですか?

4

3 に答える 3

1

この場合、外部キー値を取得するためにトリガーを使用する必要はありません。serialを使用して最新の値にアクセスできるように設定しているのでcurrval。アプリから次のようなものを実行します。

insert into filesTable (file_name, files) select 'f1', 'asdf';
insert into parcelsTable (parcel_name, filestock_id) select 'p1', currval('filesTable_num_seq');

これは、から個々のキー値を取得するために一度に1つのレコードを挿入する場合にのみ使用する必要があることに注意してくださいcurrval。私はデフォルトのシーケンス名をと呼んでいますtable_column_seq。これは、明示的に別の何かを宣言していない限り、使用できるはずです。

また、null可能性と関係を明示的に宣言することをお勧めします。

CREATE TABLE parcelsTable (
  ...
  filestock_id integer NULL REFERENCES filesTable (num)
);

これがSqlFiddleでの動作デモです。

于 2013-01-28T20:09:36.783 に答える
1

これは答えではないかもしれませんが、必要なものかもしれません。スペースが必要なので、これをコメントではなく回答にしています。

2 つのテーブルにトリガーを設定できるかどうかはわかりません。通常、これは必要ありません。あなたの場合のように、通常、親レコードと子レコードを作成するか、既存のレコードの子レコードを作成するだけです。

したがって、通常、両方を作成するときにトリガーが必要な場合は、親レコードにトリガーを配置するだけで十分です。

必要なことはできないと思います。あなたがやろうとしているのは、同じトランザクションで外部キーに親レコードの主キーを入力することです。私はあなたがそれを行うことができるとは思わない. parcelsTable の挿入で外部キーを提供する必要があると思います。

filesTable にレコードを作成していないときでも、parcelsTable にレコードを作成しているときは、この NULL をそのままにしておくことになります。したがって、INSERT ステートメントで外部キーを設定する必要があると思います。

于 2013-01-28T19:04:43.997 に答える
0

私が今持っている唯一のアイデアは、テーブルへの間接的な挿入を行う関数を作成できるということです。そうすれば、平行インサートを使用して、必要な条件を設定できます。

于 2013-01-28T11:17:47.093 に答える