6

私のテーブルには多数の列があります。一部のデータをコピーするコマンドがあります(製品のクローンと考えてください)が、将来的に列が変更される可能性があるため、テーブルからすべてを選択し、参照せずに1つの列の値のみを変更したいと思います残り。

例:の代わりに:

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データベースですが、どのプラットフォームでも回答を歓迎します。

4

5 に答える 5

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;
于 2008-12-09T12:34:55.797 に答える
3

一時テーブルを作成する手間をかけずに、SQL 内でこれを完全に実行できるとは思いません。メモリ内で実行すると、はるかに高速になります。一時テーブル ルートを使用する場合は、コードが同時に 2 回実行されて 2 行のデータが 1 つの一時テーブルにマングルされる競合状態を回避するために、関数呼び出しごとにテーブルに一意の名前を選択する必要があることに注意してください。

使用している言語の種類はわかりませんが、プログラム内のフィールドのリストを取得できるはずです。私は次のようにします:

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);

次に、それを関数としてカプセル化し、テーブル、古いID、新しい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);

お役に立てれば。

于 2009-08-03T01:26:50.077 に答える
1

あなたの例はほとんどうまくいくはずです。新しいテーブルの列名をそれに追加するだけです。


INSERT INTO MYTABLE
(id, col1, col2)
SELECT new_id,col1, col2
FROM TABLE2
WHERE ...;
于 2008-12-09T12:18:26.780 に答える
-1

私はdb2を使ったことはありませんが、mssqlでは次の手順で解決できます。このソリューションは、アイテムが取得する新しい ID を気にしない場合にのみ機能します。

1.) 同じスキームで新しいテーブルを作成しますが、id 列は自動的に増加します。(mssql "ID 仕様 = 1、ID 増分 = 1)

2.) 単純なものよりも

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

で十分なはずです。上記のステートメントに id 列を含めないでください。

于 2009-08-03T08:43:29.063 に答える