Postgresql多对多关系插入

时间:2014-08-07 05:08:46

标签: postgresql sql-insert

我正在使用Postresql 9.3.5。我在实体之间有多对多的关系" Foo"和" Bar"我已经建模为:

CREATE TABLE Foo
(
    id SERIAL PRIMARY KEY NOT NULL,
    .... various columns for foo ....
);

CREATE TABLE Bar
(
    id SERIAL PRIMARY KEY NOT NULL,
    field1 varchar(50) UNIQUE NOT NULL,
    .... various columns for bar ....
);

CREATE TABLE FooBar
(
    fooID int NOT NULL,
    barID int NOT NULL,
    PRIMARY KEY (fooID, barID),
    FOREIGN KEY (fooID) REFERENCES Foo(id),
    FOREIGN KEY (barID) REFERENCES Bar(id)
);

现在我要做的是将记录插入Foo,将相应的记录插入Bar,然后插入包含foo&的id的匹配FooBar记录。酒吧条目。

Catch:我不知道何时插入Bar记录(如果它们已经存在),所以目前我对Bar的插入看起来像是:

INSERT INTO Bar(field1, .... other fields for Bar....) 
SELECT 'value1', .... other values for the insert....
WHERE NOT EXISTS (
SELECT 1 FROM Bar WHERE field1 = 'value1')

哪个工作正常,但我的问题是:如何获取新插入(或现有)Bar记录的id,以便我可以将其插入FooBar表?

2 个答案:

答案 0 :(得分:1)

这似乎有效,虽然它远非优雅,可能非常低效:

WITH new AS (
    INSERT INTO bar(field1) 
    SELECT ('aaa') WHERE NOT EXISTS (
        SELECT 1 FROM bar WHERE field1='aaa'
    ) RETURNING id
),
existing AS (
    SELECT id FROM bar WHERE field1='aaa'
) 
SELECT id FROM existing UNION SELECT id FROM new

我认为由于在条形图中重复搜索匹配值,这将是低效的。更有效的解决方案可能是编写存储过程。

答案 1 :(得分:-1)

试试这个

INSERT INTO Bar(field1, field2,etc...) values(value1, value2,etc...) RETURNING id;

SQL FIDDLE

相关问题