あなたは自分の会社テーブル内のカウンタを埋め込むことができ
:
CREATE TABLE companies (
id SERIAL PRIMARY KEY,
name TEXT,
product_id INT DEFAULT 0
);
CREATE TABLE products (
company INT REFERENCES companies(id),
product_id INT,
PRIMARY KEY (company, product_id),
name TEXT
);
INSERT INTO companies (id, name) VALUES (1, 'Acme Corporation');
INSERT INTO companies (id, name) VALUES (2, 'Umbrella Corporation');
次に、利用UPDATE ...与えられた会社のために次のプロダクトIDを取得するためにRETURNING:
> INSERT INTO products VALUES (1, (UPDATE companies SET product_id = product_id+1 WHERE id=$1 RETURNING product_id), 'Anvil');
ERROR: syntax error at or near "companies"
LINE 1: INSERT INTO products VALUES (1, (UPDATE companies SET produc...
^
ああのNOE ! PostgreSQL 9.1以降ではUPDATE ... RETURNINGをサブクエリとして使用できないようです。
良いニュースは、問題ではありません!
CREATE FUNCTION next_product_id(company INT) RETURNS INT
AS $$
UPDATE companies SET product_id = product_id+1 WHERE id=$1 RETURNING product_id
$$ LANGUAGE 'sql';
今すぐ挿入がケーキの一部です:
INSERT INTO products VALUES (1, next_product_id(1), 'Anvil');
INSERT INTO products VALUES (1, next_product_id(1), 'Dynamite');
INSERT INTO products VALUES (2, next_product_id(2), 'Umbrella');
INSERT INTO products VALUES (1, next_product_id(1), 'Explosive tennis balls');
は、製品の価値との両方で同じ会社のIDを使用してくださいだけインクリメント/パートを返すんストアドプロシージャを作成します引数はnext_product_id(company INT)
です。
これは私の知る限り、atomic:companies.product_idが製品に対応する挿入なしで増分される可能性があることに注意してください。 –
また、現在のバージョンのPostgreSQLでは、ストアドプロシージャは必要ないかもしれません。 –