如何填充引用另一个表的列ID的空表行?

时间:2017-04-19 15:12:05

标签: sql database postgresql hibernate

我想为已经存在的每个用户填写空的notification_settings。 ID(PK)由Hibernate在每个表中自动生成。这是用户表:

CREATE TABLE lottery_user (
    id int8 not null,
    email varchar(255) not null,
    password varchar(255) not null,
    notification_settings_id int8,
    role varchar (50) default 'USER',
    registry_date TIMESTAMP  default now(),
    primary key (id)
ADD CONSTRAINT FK_USER_TO_NOTIFICATION_SETTINGS
FOREIGN KEY (notification_settings_id) REFERENCES notification_settings
);

这里是notification_settings表,我需要填写那些没有为他们填写的用户。

CREATE TABLE notification_settings (
 id int8 not NULL ,
 test1_events bool DEFAULT TRUE ,
 test2_events bool DEFAULT TRUE ,
 test3_events bool DEFAULT TRUE ,
 test4_events bool DEFAULT TRUE ,
 PRIMARY KEY (id)
);

基本上,我需要使用"INSERT INTO notification_settings (test1_events, test2_events, test3_events, test4_events) VALUES (True, True, True, True)"类似的东西。当然,条件应该是这样的"这些行对于用户来说是空的"。我似乎无法使Syntax正确。

BIG注意: SQL代码用于演示目的,因此您可以了解我的表格类型。我只需要正确的INSERT脚本。表工作正常,只需要为已经存在的用户生成notification_settings值。

另一个注意事项:使用Flyway,所以它不仅仅是关于Hibernate。如果这与任何事情有关。

4 个答案:

答案 0 :(得分:1)

您只是在寻找:

INSERT INTO notification_settings (id)

SELECT       id
FROM         user
WHERE        id NOT IN (SELECT id FROM notifiation_settings)

您可能希望插入标识字段:

SET IDENTITY_INSERT my_table ON

答案 1 :(得分:1)

由于您的外键约束从notification_settings转到user,条件为#34;其中这些行对于用户X而言是空的"不适用于您的架构。另一方面 - "我想为已经存在的每个用户填写空的notification_settings"可以使用insert...select构造来完成:

set @rank=0
select @maxid = max(id) from notification_settings

insert into notification_settings (id)
select @maxid + @rank:=@rank+1 as rank
from user
where notification_settings_id is null

有趣的是如何将这些新生成的ID放回用户表中。下次的家庭作业:)

答案 2 :(得分:1)

INSERT INTO notification_settings(id)

SELECT u.id.   来自用户u   WHERE
    不存在(SELECT * FROM notifiation_settings ns,其中ns.id = i.id)

答案 3 :(得分:0)

我将回答我自己的问题,我是如何处理它的。首先,我将ID插入notification_settings id,然后我获取这些ID并将其设置为lottery_user表格的FK(notification_settings_id)。然后我只删除不需要的ID。是的不完美,但它的工作原理。

INSERT INTO notification_settings  (id) select lu.id from lottery_user lu where lu.id not in(select ns.id from notification_settings ns);

update lottery_user lu set notification_settings_id = (select ns.id from notification_settings ns where ns.id = lu.id) where lu.notification_settings_id is null;

delete from notification_settings ns where not exists (select * from lottery_user lu where lu.notification_settings_id = ns.id);

此外,还为新的Lottery_user实体更改了序列。

do $$
declare maxid int;
begin
select max(id) from lottery_user into maxid;
IF maxid IS NOT NULL THEN
EXECUTE 'ALTER SEQUENCE notification_settings_seq START with '|| maxid;
END IF;
end;
$$ language plpgsql;