你可以只嵌入在你的公司表計數器:
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爲特定公司:
> 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...
^
哦不一!看來你不能(從PostgreSQL 9.1devel)使用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)
。
請注意,這是不(據我所知)原子:companies.product_id可能會增加沒有相應的插入產品。 – 2014-09-22 17:28:23