PHP,用于将 db2 数据从一个数据库移动到另一个数据库的脚本
PHP, script for moving db2 data from one database to another
我需要将一些数据从开发数据库的表移植到生产数据库的相同表中,但生产已经有主键与开发数据库匹配的记录,所以我无法将数据转储到主键中keysbundleRenderer.renderToStream
在这种情况下,item_id
是父记录中的主键,用于将子记录关联到它。执行父记录的插入将创建一个新的主键,因此我需要子插入也具有新创建的主键,以便在生产中保持关系 databasebundleRenderer.renderToStream
到目前为止我的脚本:
<?php
$DB2connPROD = odbc_connect("schema","user", "pass");
$DB2connDEV = odbc_connect("schema","user", "pass");
//Get itemt records from dev
$getDevitems = "
select item_id,item_typet_id,item_identifier,expiration_timestamp
from development.itemt where item_typet_id in (2,3)
";
//$getDevitems will get records that have a primary key item_id which is used to get the records in the following select queries
foreach($getDevitems as $items){
//Get all comments
$getComments = "
select tc.item_id, tc.comment, tc.comment_type_id from development.item_commentt tc
inner join development.itemt t on tc.item_id = t.item_id
where t.item_id = {item_id_from_getDevitems}
";
$insertitem = "INSERT into production (item_identifier,expiration_timestamp)
values (item_identifier,expiration_timestamp)";
$insertComment = "INSERT into productionComment (item_id, comment, comment_type_id)
values (item_id, comment, comment_type_id)";
}
?>
所以如果 $getDevitems returns
item_id | item_typet_id | item_identifier | expiration_timestamp
----------------------------------------------------------------------------
123 1 544 '2020-03-01 12:00:00'
我希望它现在 运行 评论 select 以 123 作为 where 子句中的 ID:
select tc.item_id, tc.comment, tc.comment_type_id from development.item_commentt tc
inner join development.itemt t on tc.item_id = t.item_id
where t.item_id = 123
现在,对于我的旧父记录,我拥有所有父数据和所有关系子数据。所以我想将新的父记录插入数据库,创建新的 ID,并使用新创建的主 key/ID 插入子记录。所以对于新的父记录我会做:
$insertitem = "INSERT into production (item_identifier,expiration_timestamp)
values (544,'2020-03-01 12:00:00')";
假设创建了 item_id = 43409 的新记录。我希望我的评论插入为:
$insertComment = "INSERT into productionComment (item_id, comment, comment_type_id)
values (43409, comment, comment_type_id)";
底线:我需要从开发数据库中获取关系数据(全部基于 item_id),并将这些数据插入到新数据库中,这会创建一个新的主键,但我需要保持这种关系。
我怎样才能正确地完成它来做我需要的事情并确保我保持每个最初 selected 项目的完整关系?
我无法帮助 PHP,但对于 DB2 for IBMi,您有不同的解决方案:
如果我理解正确的话item_id 是一个 GENERATED ALWAYS as IDENTITY 列
您可以使用
获得新创建的item_id
select item_id from final table (
INSERT into production (item_identifier,expiration_timestamp)
values (544,'2020-03-01 12:00:00')
)
或者您可以用开发值或您自己的增量强制 item_id 的值
INSERT into production (idtem_id, item_identifier,expiration_timestamp)
values (<your value>, 544,'2020-03-01 12:00:00')
OVERRIDING SYSTEM VALUE
在这种情况下,您必须通过发出
来为 item_id 设置下一个值
alter table production alter column item_id restart with <restart value>
鉴于您的插入内容是:
$insertitem = "INSERT into production (item_identifier,expiration_timestamp)
values (item_identifier,expiration_timestamp)";
$insertComment = "INSERT into productionComment (item_id, comment, comment_type_id)
values (item_id, comment, comment_type_id)";
您似乎在使用 item_id 的标识列。您可以使用 IDENTITY_VAL_LOCAL()
函数检索最近生成的标识值,因此第二个插入应该是:
$insertComment = "INSERT into productionComment (item_id, comment, comment_type_id)
values (IDENTITY_VAL_LOCAL(), comment, comment_type_id)";
我需要将一些数据从开发数据库的表移植到生产数据库的相同表中,但生产已经有主键与开发数据库匹配的记录,所以我无法将数据转储到主键中keysbundleRenderer.renderToStream
在这种情况下,item_id
是父记录中的主键,用于将子记录关联到它。执行父记录的插入将创建一个新的主键,因此我需要子插入也具有新创建的主键,以便在生产中保持关系 databasebundleRenderer.renderToStream
到目前为止我的脚本:
<?php
$DB2connPROD = odbc_connect("schema","user", "pass");
$DB2connDEV = odbc_connect("schema","user", "pass");
//Get itemt records from dev
$getDevitems = "
select item_id,item_typet_id,item_identifier,expiration_timestamp
from development.itemt where item_typet_id in (2,3)
";
//$getDevitems will get records that have a primary key item_id which is used to get the records in the following select queries
foreach($getDevitems as $items){
//Get all comments
$getComments = "
select tc.item_id, tc.comment, tc.comment_type_id from development.item_commentt tc
inner join development.itemt t on tc.item_id = t.item_id
where t.item_id = {item_id_from_getDevitems}
";
$insertitem = "INSERT into production (item_identifier,expiration_timestamp)
values (item_identifier,expiration_timestamp)";
$insertComment = "INSERT into productionComment (item_id, comment, comment_type_id)
values (item_id, comment, comment_type_id)";
}
?>
所以如果 $getDevitems returns
item_id | item_typet_id | item_identifier | expiration_timestamp
----------------------------------------------------------------------------
123 1 544 '2020-03-01 12:00:00'
我希望它现在 运行 评论 select 以 123 作为 where 子句中的 ID:
select tc.item_id, tc.comment, tc.comment_type_id from development.item_commentt tc
inner join development.itemt t on tc.item_id = t.item_id
where t.item_id = 123
现在,对于我的旧父记录,我拥有所有父数据和所有关系子数据。所以我想将新的父记录插入数据库,创建新的 ID,并使用新创建的主 key/ID 插入子记录。所以对于新的父记录我会做:
$insertitem = "INSERT into production (item_identifier,expiration_timestamp)
values (544,'2020-03-01 12:00:00')";
假设创建了 item_id = 43409 的新记录。我希望我的评论插入为:
$insertComment = "INSERT into productionComment (item_id, comment, comment_type_id)
values (43409, comment, comment_type_id)";
底线:我需要从开发数据库中获取关系数据(全部基于 item_id),并将这些数据插入到新数据库中,这会创建一个新的主键,但我需要保持这种关系。
我怎样才能正确地完成它来做我需要的事情并确保我保持每个最初 selected 项目的完整关系?
我无法帮助 PHP,但对于 DB2 for IBMi,您有不同的解决方案:
如果我理解正确的话item_id 是一个 GENERATED ALWAYS as IDENTITY 列
您可以使用
获得新创建的item_idselect item_id from final table (
INSERT into production (item_identifier,expiration_timestamp)
values (544,'2020-03-01 12:00:00')
)
或者您可以用开发值或您自己的增量强制 item_id 的值
INSERT into production (idtem_id, item_identifier,expiration_timestamp)
values (<your value>, 544,'2020-03-01 12:00:00')
OVERRIDING SYSTEM VALUE
在这种情况下,您必须通过发出
来为 item_id 设置下一个值alter table production alter column item_id restart with <restart value>
鉴于您的插入内容是:
$insertitem = "INSERT into production (item_identifier,expiration_timestamp)
values (item_identifier,expiration_timestamp)";
$insertComment = "INSERT into productionComment (item_id, comment, comment_type_id)
values (item_id, comment, comment_type_id)";
您似乎在使用 item_id 的标识列。您可以使用 IDENTITY_VAL_LOCAL()
函数检索最近生成的标识值,因此第二个插入应该是:
$insertComment = "INSERT into productionComment (item_id, comment, comment_type_id)
values (IDENTITY_VAL_LOCAL(), comment, comment_type_id)";