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
Postgresql Scriptella-如何获取和重用自动生成的ID?_Postgresql_Scriptella - Fatal编程技术网

Postgresql Scriptella-如何获取和重用自动生成的ID?

Postgresql Scriptella-如何获取和重用自动生成的ID?,postgresql,scriptella,Postgresql,Scriptella,我使用Scriptella进行ETL操作,处理许多由自动生成的ID引用的表。我想在不使用子查询的情况下重新使用这些ID,这是etl文件的脚本片段: <script connection-id="out" if="rownum>1"> SELECT nextval('SQC_CLASE') AS claseId; INSERT INTO zoologia.clase VALUES( ?claseId, ?phylumId, ?clase, ?subclase, ?infracl

我使用Scriptella进行ETL操作,处理许多由自动生成的ID引用的表。我想在不使用子查询的情况下重新使用这些ID,这是etl文件的脚本片段:

<script connection-id="out" if="rownum>1">

SELECT nextval('SQC_CLASE') AS claseId;
INSERT INTO zoologia.clase VALUES( ?claseId, ?phylumId, ?clase, ?subclase, ?infraclase, true );

SELECT nextval('SQC_ORDEN') AS ordenId;
INSERT INTO zoologia.orden VALUES( ?ordenId, ?claseId, ?orden, ?suborden, true );

SELECT nextval('SQC_SUPERFAMILIA') AS superfamiliaId;
INSERT INTO zoologia.superfamilia VALUES( ?superfamiliaId, ?ordenId, ?superfamilia, true );

SELECT nextval('SQC_FAMILIA') AS familiaId;
INSERT INTO zoologia.familia VALUES( ?familiaId, ?superfamiliaId, ?familia, ?subfamilia, ?tribu, true );

SELECT nextval('SQC_GENERO') AS generoId;
INSERT INTO zoologia.genero VALUES( ?generoId, ?familiaId, ?genero, true );

SELECT nextval('SQC_ESPECIE') AS especieId;
INSERT INTO zoologia.especie VALUES( ?especieId, ?generoId, ?especie, ?subespecie, ?variedad, ?genero, true );

</script>

选择nextval('SQC_CLASE')作为claseId;
插入zoologia.clase值(?claseId,?phylumId,?clase,?subclass,?subclase,true);
选择nextval('SQC_ORDEN')作为ordenId;
插入zoologia.orden值(?ordenId,?claseId,?orden,?suborden,true);
选择nextval('SQC_SUPERFAMILIA')作为superfamiliaId;
插入zoologia.superfamilia值(?superfamiliaId,?ordenId,?superfamilia,true);
选择nextval(“SQC_FAMILIA”)作为familiaId;
插入zoologia.familia值(?familiaId,?superfamiliaId,?familia,?subfamilia,?triba,true);
选择nextval(“SQC_慷慨”)作为慷慨ID;
插入zoologia.慷慨解囊值(?慷慨解囊ID,?家族ID,?慷慨解囊,真);
选择nextval('SQC_specie')作为specieid;
在zoologia中插入特殊值(?特殊ID,?慷慨ID,?特殊,?子特殊,?变量D,?慷慨,真);
这显然是错误的,因为
SELECT
不能在脚本中执行,对吗?我真的不知道在没有子查询的情况下如何做。我正在使用PostgreSQL

编辑:
我想要实现的是,例如,获取在第一个表的插入中使用的自动生成id的值,以便在第二个表的插入中使用它,因为记录应该被引用

您的代码最初看起来完全是假的,由于似乎没有任何东西将
SELECT
连接到下面的
INSERT
,因此即使它运行了,您也只是在生成一个ID并将其丢弃。看起来您的脚本工具可能会自动将
SELECT
列别名的结果定义为变量,以便在以后的查询中引用;看见快速浏览一下,您可能会发现您想要做的事情是可行的,但您必须使用嵌套的
块来完成

使用序列生成ID的正确方法是:

INSERT INTO zoologia.especie VALUES( nextval('SQC_ESPECIE'), ?generoId, ?especie, ?subespecie, ?variedad, ?genero, true );

INSERT INTO zoologia.especie VALUES( DEFAULT, ?generoId, ?especie, ?subespecie, ?variedad, ?genero, true );

INSERT INTO zoologia.especie(generoId, especie, subespecie, variedad, genero, someothercol) 
VALUES( ?generoId, ?especie, ?subespecie, ?variedad, ?genero, true );
您最初的问题似乎是关于重新使用已删除的ID(即无间隙序列),但看起来您已经澄清了这一点以删除它


编辑+评论更改问题含义后更新

如果您试图在后续的
INSERT
s中使用从一行生成的ID,则必须:

  • 使用
    插入捕获ID。。。在
    INSERT
    之后返回
    或调用
    currval('the_id_sequence')
    ,将id存储在脚本语言的客户端变量中,并将其传递给后续的
    INSERT
    s;或

  • 在后续插入的
    值列表中使用
    currval('u-id\u-sequence')

我甚至从未听说过Scriptella,更不用说使用它了,所以我无法帮助您选择使用客户端变量的第一个选项。如果它没有办法存储
SELECT
INSERT的结果,我会非常惊讶。。。返回
供以后使用。快速浏览一下就可以知道它是用嵌套的
块完成的,但这只是本教程的30秒浏览

第二种选择很简单。假设您刚刚插入:

INSERT INTO zoologia.genero VALUES( DEFAULT, ?familiaId, ?genero, true );
并希望在
特别是
中插入一个新行,该行具有刚刚插入的
慷慨
慷慨ID
。假定
grano
的ID序列遵循PostgreSQL使用的标准命名,
tablename\u columnname\u ID\u seq
,您将使用:

INSERT INTO zoologia.especie VALUES( DEFAULT, currval('genero_generoId_seq'), ...);
见:


    • 感谢Scriptella论坛的用户,这是一个解决方案,一个包含所有序列值的单一查询:

      <query connection-id="external">
          <query connection-id="sizoo">
              SELECT nextval('SQC_PHYLUM') AS phylumId
              , nextval('SQC_CLASE') AS claseId
              , nextval('SQC_ORDEN') AS ordenId
              , nextval('SQC_SUPERFAMILIA') AS superfamiliaId
              , nextval('SQC_FAMILIA') AS familiaId
              , nextval('SQC_GENERO') AS generoId
              , nextval('SQC_ESPECIE') AS especieId;
      
              <script connection-id="sizoo" if="rownum>1">
                  INSERT INTO zoologia.phylum VALUES( ?phylumId, ?phylum, true );
                  INSERT INTO zoologia.clase VALUES( ?claseId, ?phylumId, ?clase, ?subclase, ?infraclase, true );
                  INSERT INTO zoologia.orden VALUES( ?ordenId, ?claseId, ?orden, ?suborden, true );
                  INSERT INTO zoologia.superfamilia VALUES( ?superfamiliaId, ?ordenId, ?superfamilia, true );
                  INSERT INTO zoologia.familia VALUES( ?familiaId, ?superfamiliaId, ?familia, ?subfamilia, ?tribu, true );
                  INSERT INTO zoologia.genero VALUES( ?generoId, ?familiaId, ?genero, true );
                  INSERT INTO zoologia.especie VALUES( ?especieId, ?generoId, ?especie, ?subespecie, ?variedad, ?genero, true );
              </script>
          </query>
      </query>
      
      
      选择nextval(“SQC_门”)作为门
      ,nextval(‘SQC_分类’)作为分类
      ,nextval(“SQC_ORDEN”)作为ordenId
      ,nextval('SQC_SUPERFAMILIA')作为superfamiliaId
      ,nextval(“SQC_家族”)作为家族ID
      ,nextval(‘SQC_慷慨’)作为慷慨ID
      ,nextval(“SQC_specie”)作为specieid;
      插入zoologia.phylum值(?phylumId,?phylum,true);
      插入zoologia.clase值(?claseId,?phylumId,?clase,?subclass,?subclase,true);
      插入zoologia.orden值(?ordenId,?claseId,?orden,?suborden,true);
      插入zoologia.superfamilia值(?superfamiliaId,?ordenId,?superfamilia,true);
      插入zoologia.familia值(?familiaId,?superfamiliaId,?familia,?subfamilia,?triba,true);
      插入zoologia.慷慨解囊值(?慷慨解囊ID,?家族ID,?慷慨解囊,真);
      在zoologia中插入特殊值(?特殊ID,?慷慨ID,?特殊,?子特殊,?变量D,?慷慨,真);
      
      为什么要对已删除的项目重复使用ID?。。。为什么不使用子查询呢?您说过“不使用子查询”,但并不是为什么。为了澄清,这是一个脚本片段,用于ETL操作,我使用Scriptella。原因是,有7个表由自动生成的id相互引用,我需要在所有这些表中插入记录,但使用Scriptella我无法获取第一个表的自动生成id的值,例如,为了在第二个表中使用它进行插入,因为记录应该是referenced@Neotaku好啊这比你原来的问题更有意义。很难弄清楚你想要什么。答案更新。这只适用于博士后。如果Scriptella在最后一次插入时使用stmt.getGeneratedKeys()提供了一个变量,那么这似乎是一个更好的解决方案,我们可以用一种与数据库无关的方式来实现。