Sql 当要更新的每一行都是不同的值时,如何更新现有表
我有一个Sql 当要更新的每一行都是不同的值时,如何更新现有表,sql,postgresql,Sql,Postgresql,我有一个文件表,其中有数据列,文件的数据存储在字节中。出于性能原因,我不得不取出数据列并将其放入名为fileData的新表中文件和文件数据表具有@OnetoOne映射 CREATE TABLE public.file ( id character varying(255) NOT NULL, contenttype character varying(255), name character varying(255), size character varying(255),
文件
表,其中有数据
列,文件的数据存储在字节中。出于性能原因,我不得不取出数据列并将其放入名为fileData
的新表中<代码>文件和文件数据
表具有@OnetoOne
映射
CREATE TABLE public.file
(
id character varying(255) NOT NULL,
contenttype character varying(255),
name character varying(255),
size character varying(255),
dataId character varying(255),
CONSTRAINT file_pkey PRIMARY KEY (id),
CONSTRAINT fk8af75923ef78c73c FOREIGN KEY (dataId)
REFERENCES public.filedata (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
CREATE TABLE filedata
(
id character varying(255) NOT NULL,
filedata bytea,
CONSTRAINT filedata_pkey PRIMARY KEY (id)
)
现在我需要将文件表中数据列的所有值移植到文件数据表。我该怎么做?我使用的存储过程如下所示。但我不确定如何为文件表的所有行更新dataId
CREATE OR REPLACE FUNCTION moveDataToNewTable() RETURNS void AS
$BODY$
DECLARE
dataId integer;
_r record;
BEGIN
dataId = 0;
for _r in (select * from file) loop
dataId= dataId+1;
INSERT INTO filedata (id, data) VALUES (dataId, _r.data);
--update file table set dataId to current value of dataId
end loop;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
谢谢。
dataId=dataId+1
是完全错误的,因为您的“ID”都是字符串,您不能只在字符串中“添加一个”。如果你想要自动生成的代码,你必须使它们成为整数ID@a_horse_with_no_name . . . 这并不完全正确。请注意,您完全正确,类型不应该像这样混合。但是,Postgres将尝试隐式地将字符串转换为数字。如果成功,则+1
将起作用,并且该值将被重新转换为赋值。我绝对不赞成隐式转换,但如果字符串表示数字,您可以“只向字符串添加一个”。谢谢您的评论。同意上述计算ID不是推荐的方法。我尝试了另一种选择。我没有为每个附件行编写存储过程,而是为“setFileData”编写了一个服务,但现在我得到了,原因是:java.lang.OutOfMemoryError:在保存文件时超出了GC开销限制。
。您选择了文件
引用文件数据
,而不是相反?根据您的描述,我希望文件数据
引用文件
。这样,您就可以对filedata
@stickybit中的相应行使用与file
中相同的ID值,而对file
和filedata
使用相同的ID则是更好的选择。但是,我无法实现文件
,因为文件
表中的id是自动生成的id,因此在保存文件对象时,我不会将其id分配给文件数据
。因此,两个表的ID都不同。