如何复制记录,只更改ID?

时间:2008-12-09 12:13:14

标签: sql db2

我的表有很多列。我有一个复制一些数据的命令 - 将其视为克隆产品 - 但由于列可能在将来发生变化,我只想从表中选择所有内容,只更改一列的值而不必参考其余的。

例如,而不是:

INSERT INTO MYTABLE (
SELECT NEW_ID, COLUMN_1, COLUMN_2, COLUMN_3, etc
FROM MYTABLE)

我想要类似的东西

INSERT INTO MYTABLE (
SELECT * {update this, set ID = NEW_ID}
FROM MYTABLE)

有一种简单的方法吗?

这是iSeries上的DB2数据库,但欢迎任何平台的答案。

5 个答案:

答案 0 :(得分:10)

你可以这样做:

create table mytable_copy as select * from mytable;
update mytable_copy set id=new_id;
insert into mytable select * from mytable_copy;
drop table mytable_copy;

答案 1 :(得分:3)

我不认为这在SQL中是完全可行的,而不会遇到创建临时表的麻烦。在内存中执行它应该快得多。请注意,如果您使用临时表路由,则必须为每个函数调用选择表的唯一名称,以避免代码同时运行两次并将两行数据分成一个临时表的竞争条件。

我不知道您使用的是哪种语言,但应该可以获得程序中的字段列表。我会这样做:

array_of_field_names = conn->get_field__list;
array_of_row_values = conn->execute ("SELECT... ");
array_of_row_values ["ID"] = new_id_value
insert_query_string = "construct insert query string from list of field names and values";
conn->execute (insert_query_string);

然后你可以把它作为一个函数封装起来,只需要调用它来指定table,old id和new id,它就会起作用。

在Perl代码中,以下代码段可以执行:

$table_name = "MYTABLE";
$field_name = "ID";
$existing_field_value = "100";
$new_field_value = "101";

my $q = $dbh->prepare ("SELECT * FROM $table_name WHERE $field_name=?");
$q->execute ($existing_field_value);
my $rowdata = $q->fetchrow_hashref; # includes field names
$rowdata->{$field_name} = $new_field_value;

my $insq = $dbh->prepare ("INSERT INTO $table_name (" . join (", ", keys %$rowdata) . 
    ") VALUES (" . join (", ", map { "?" } keys %$rowdata) . ");";
$insq->execute (values %$rowdata);

希望这有帮助。

答案 2 :(得分:2)

好的,试试这个:

declare @othercols nvarchar(max);
declare @qry nvarchar(max);

select @othercols = (
select ', ' + quotename(name)
from sys.columns
where object_id = object_id('tableA')
and name <> 'Field3'
and is_identity = 0
for xml path(''));

select @qry = 'insert mynewtable (changingcol' + @othercols + ') select newval' + @othercols;

exec sp_executesql @qry;

在运行“sp_executesql”行之前,请执行“选择@qry”以查看您将要运行的命令。

当然,您可能希望将其粘贴到存储过程中并传入变量而不是“Field3”位。

罗布

答案 3 :(得分:1)

你的榜样几乎可以奏效。 只需添加新表的列名即可。


INSERT INTO MYTABLE
(id, col1, col2)
SELECT new_id,col1, col2
FROM TABLE2
WHERE ...;

答案 4 :(得分:-1)

我从未使用过db2,但在mssql中你可以通过以下步骤解决它。这个解决方案只有在您不关心项目获得的新ID时才有效。

1。)创建具有相同方案的新表,但id列自动增加。 (mssql“identitity specification = 1,identity increment = 1)

2。)而不是简单的

insert into newTable(col1, col2, col3)
select (col1, col2, col3) from oldatable

应该足够了,请确保不要在上面的陈述中包含你的id列