0

選択から値を取得し、挿入で使用する変数を作成する必要がありますが、PostgreSQL では可能ですか? ホスティングで許可されていないため、関数を作成できません。

テーブル作成スキーマは次のとおりです。

CREATE SEQUENCE identificador_produto START 1;

CREATE TABLE product (
    id integer DEFAULT nextval('identificador_produto') primary key,
    description varchar(60) not null
);

CREATE TABLE material (
    product_id integer DEFAULT nextval('identificador_produto') primary key,
    description varchar(60) not null
);

必要なものを説明する例:

begin;

    select currval('identificador_produto') as id;

    insert into material (product_id, description) values (id, 'Gold');
    insert into material (product_id, description) values (id, 'Silver');
    insert into material (product_id, description) values (id, 'Wood');
    insert into material (product_id, description) values (id, 'Steel');
    insert into material (product_id, description) values (id, 'Water');
    insert into material (product_id, description) values (id, 'Paper');

commit;

「id」値を変数に割り当てる必要があり、それらはそれを使用して同じトランザクションでいくつかの挿入を行いますが、挿入は「製品」の同じシーケンスを共有します。このため、curval() 関数を使用できませんそうしないと、各挿入が異なる ID を取得します。

誰でも私を助けることができますか?

4

4 に答える 4

3

currvalまず、あなたの理解が間違っていると思います。シーケンスから取得された、最後に生成された ID をcurrval 返します。

以下は、同じ ID を持つすべての行を挿入します。

insert into material (product_id, description) 
values (nextval('identificador_produto'), 'Gold');

insert into material 
(product_id, description) 
values 
(currval('identificador_produto'), 'Silver');

insert into material 
(product_id, description) 
values 
(currval('identificador_produto'), 'Wood');

insert into material 
(product_id, description) 
values 
(currval('identificador_produto'), 'Steel');

insert into material 
(product_id, description) 
values 
(currval('identificador_produto'), 'Water');

insert into material 
(product_id, description) 
values 
(currval('identificador_produto'), 'Paper');

最初のものは新しいID を生成し、後続の sは同じ id をINSERT再利用します。これはトランザクションセーフであり、何千もの接続がこれを行う場合でも正しく機能します (これがシーケンスの利点です)。

しかし、あなたのテーブルのデザインは間違っていると思います。テーブルを定義した方法では、説明列を製品テーブルに移動するだけです。

私の推測では、実際には次のようなものが必要です。

CREATE SEQUENCE identificador_produto START 1;

CREATE TABLE product (
    id integer DEFAULT nextval('identificador_produto') primary key,
    description varchar(60) not null
);

CREATE TABLE material (
    material_id serial primary key,
    product_id integer not null 
       references product(id),
    description varchar(60) not null
);

これは、特定の製品を参照する資料に 1 つ以上の行があることを意味します。挿入パターンは次のようになります。

insert into product
(description) 
values 
('foobar');

insert into material 
(product_id, description)
values
(currval('identificador_produto'), 'silver');

insert into material 
(product_id, description)
values
(currval('identificador_produto'), 'gold');
于 2012-04-27T07:30:24.783 に答える
2

同じトランザクションで同じ id 値を使用して両方の挿入を行う場合は、これが良い代替手段になる可能性があります。

WITH x(descr) AS (VALUES ('Gold'), ('Silver'))
INSERT INTO material (product_id, description)
  SELECT id, descr
    FROM x,
        (SELECT id FROM product WHERE condition = 100) y;

変数を含む命令型コードが本当に必要な場合のもう 1 つの可能性は、DO コンストラクトです。

http://www.postgresql.org/docs/current/interactive/sql-do.html

于 2012-04-26T19:46:04.083 に答える
2

そのための変数は必要ありません。

insert into material (product_id, description) values (
    (select id from product where condition = 100)
    , 'Gold');
于 2012-04-26T19:25:35.457 に答える
1

ええ、最初に宣言セクションで変数を宣言します。

次に、「条件=100の製品から変数にIDを選択」と言います。続行します

    declare
    myvar int;
    begin
    select id into myvar from product where condition = 100;

    ...
    end;
于 2012-04-26T18:37:50.357 に答える