2017-03-09 120 views
1

我有两个表accountsprojectsPostgres的更新插入之前,新的变量在触发器

create table accounts (
    id   bigserial primary key, 
    slug  text unique 
); 


create table projects (
    id   bigserial primary key, 
    account_id bigint not null references accounts (id), 
    name  text 
); 

我希望能够插入新行projects通过指定唯一account.slug(不account.id)。我想要实现的是一样的东西:

INSERT into projects (account_slug, name) values ('account_slug', 'project_name'); 

我想过使用触发器(遗憾的是它不工作):

create or replace function trigger_projects_insert() returns trigger as $$ 
begin 
    if TG_OP = 'INSERT' AND NEW.account_slug then 

    select id as account_id 
     from accounts as account 
     where account.slug = NEW.account_slug; 

    NEW.account_id = account_id; 

    -- we should also remove NEW.account_slug but don't know how 

    end if; 
    return NEW; 
end; 
$$ LANGUAGE plpgsql; 

create trigger trigger_projects_insert before insert on projects 
    for each row execute procedure trigger_projects_insert(); 

什么是要做到我的最好办法米试图做什么?

触发是一个好主意吗? 有没有其他解决方案?

回答

1
WITH newacc AS (
    INSERT INTO accounts (slug) 
     VALUES ('account_slug') 
     RETURNING id 
) 
INSERT INTO projects (account_id, name) 
    SELECT id, 'project_name' 
     FROM newacct; 

如果你在你可以使用SQL的限制,另一个想法可能会定义两个表在上查看和创建底层表上执行两个INSERT S中的视图的INSTEAD OF INSERT触发。然后一个INSERT声明就像你问题中的声明一样。

+0

感谢您的回复,我使用https://postgrest.com/en/v0.4/,不知道您是否熟悉它,即使您的解决方案正确,也不会真正起作用使用postgrest,这就是为什么我想使用触发器。 – julesbou

+0

我想说,如果不能正确使用数据库,应该使用不同的东西,但它可能不适用于您的选择。我会添加一个不同的想法,也许这将有所帮助。 –