Postgresql Scriptella-如何获取和重用自动生成的ID?
我使用Scriptella进行ETL操作,处理许多由自动生成的ID引用的表。我想在不使用子查询的情况下重新使用这些ID,这是etl文件的脚本片段: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
<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
或调用
,将id存储在脚本语言的客户端变量中,并将其传递给后续的currval('the_id_sequence')
s;或INSERT
- 在后续插入的
值列表中使用
currval('u-id\u-sequence')
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()提供了一个变量,那么这似乎是一个更好的解决方案,我们可以用一种与数据库无关的方式来实现。