Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当要更新的每一行都是不同的值时,如何更新现有表_Sql_Postgresql - Fatal编程技术网

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都不同。