Sql Postgres-从表中选择值时在Insert INTO查询中插入时间戳?

Sql Postgres-从表中选择值时在Insert INTO查询中插入时间戳?,sql,postgresql,ecto,Sql,Postgresql,Ecto,我试图在Phoenix应用程序中运行迁移,但Postgrex返回以下错误: null value in column "inserted_at" violates not-null constraint 生成该错误的查询是: execute "INSERT INTO contract_groups (SELECT c.id, fg.group_id FROM contracts c, folder_groups fg WHERE c.folder_id = fg.folder_id)"

我试图在Phoenix应用程序中运行迁移,但Postgrex返回以下错误:

null value in column "inserted_at" violates not-null constraint
生成该错误的查询是:

execute "INSERT INTO contract_groups
  (SELECT c.id, fg.group_id FROM contracts c, folder_groups fg
  WHERE c.folder_id = fg.folder_id)"
我尝试将查询更新为:

execute "INSERT INTO contract_groups
  (contract_id, group_id, inserted_at)
  VALUES ((SELECT c.id, fg.group_id FROM contracts c, folder_groups fg 
  WHERE c.folder_id = fg.folder_id), NOW())"
但我得到另一个错误,即
子查询必须只返回一列

是表的粗略定义

insert into contract_groups (contract_id, group_id, inserted_at)
select c.id, fg.group_id, CURRENT_TIMESTAMP
from contracts c
inner join folder_groups fg
on fg.folder_id = c.folder_id
注意,这取决于所选列与语句中列的顺序匹配

更新:

根据评论,请尝试:

insert into contract_groups (contract_id, group_id, inserted_at)
select distinct c.id, -- distinct added to prevent duplicates
                fg.group_id, 
                CURRENT_TIMESTAMP
from contracts c
inner join folder_groups fg
on fg.folder_id = c.folder_id
where not exists ( -- exclude any combos that are in the target table
                 select 1 
                 from contract_groups cg
                 where cg.contract_id = c.id
                 and fg.froup_id = cg.group_id
                 )
注意,这取决于所选列与语句中列的顺序匹配

更新:

根据评论,请尝试:

insert into contract_groups (contract_id, group_id, inserted_at)
select distinct c.id, -- distinct added to prevent duplicates
                fg.group_id, 
                CURRENT_TIMESTAMP
from contracts c
inner join folder_groups fg
on fg.folder_id = c.folder_id
where not exists ( -- exclude any combos that are in the target table
                 select 1 
                 from contract_groups cg
                 where cg.contract_id = c.id
                 and fg.froup_id = cg.group_id
                 )

向我们展示表格定义。今天的提示:切换到现代的显式
JOIN
语法。更易于写入(无错误),更易于读取(和维护),并且在需要时更易于转换为外部联接。(不相关,但仍然是一个很好的提示!)为什么在第二个查询中添加
,通常不使用
SELECT
?@jarlh请参阅更新的说明中的要点如何使用表定义。今天的提示:切换到现代的显式
JOIN
语法。更易于写入(无错误),更易于读取(和维护),并且在需要时更易于转换为外部联接。(不相关,但仍然是一个很好的提示!)为什么在第二次查询中添加
,通常不使用
SELECT
?@jarlh请查看更新的描述中的要点。我必须添加
updated\u at
CURRENT\u TIMESTAMP
,因为它有一个非空约束,比如
inserted\u at
。还有一个问题,我如何确保这只插入在
contract\u-id
表中仍然不存在的
contract\u-id
group\u-id
值的唯一对?谢谢。我必须添加
updated\u at
CURRENT\u TIMESTAMP
,因为它有一个非空约束,比如
inserted\u at
。还有一个问题,我如何确保这只插入在
合同组中仍然不存在的
合同id
组id
值的唯一对?