我想为已经存在的每个用户填写空的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。如果这与任何事情有关。
答案 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;