Skip to content

Instantly share code, notes, and snippets.

@dillonhafer
Created August 23, 2019 16:01
Show Gist options
  • Save dillonhafer/e3455dc219a39f996ff785e1a5888fc3 to your computer and use it in GitHub Desktop.
Save dillonhafer/e3455dc219a39f996ff785e1a5888fc3 to your computer and use it in GitHub Desktop.
I cannot explain why this works
create table users (
name text not null primary key
);
create table groups (
name text not null primary key,
owner text not null references users
);
create table groups_users (
id serial primary key,
user_name text not null references users,
group_name text not null references groups,
unique (user_name, group_name)
);
alter table groups
add foreign key (name, owner) references groups_users (group_name, user_name);
insert into users (name) values ('my name');
-- this fails
insert into groups (name, owner) values ('my group', 'my name');
insert into groups_users (group_name, user_name) values ('my group', 'my name');
-- this fails
begin;
insert into groups (name, owner) values ('my group', 'my name');
insert into groups_users (group_name, user_name) values ('my group', 'my name');
commit;
-- this works
with new_group as (
insert into groups (name, owner)
values ('my group', 'my name')
returning name, owner
)
insert into groups_users (group_name, user_name)
select new_group.name, new_group.owner
from new_group;
--cleanup
drop table groups_users cascade;
drop table groups cascade;
drop table users cascade
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment