[Oracle]テーブルAの既存レコードにID2を付与する方法

このQ&Aのポイント
  • テーブルAの既存レコードにID2を付与する方法を説明します。
  • ID1の昇順にID2を付与するためのSQL文を組む方法について教えてください。
  • ID2用のシーケンシャル番号を作成し、既存レコードに順番に付与する方法を教えてください。
回答を見る
  • ベストアンサー

[Oracle]IDの昇順にupdateをしたい

お世話になります。 不明な部分が多々あるかと思いますが、宜しくお願いします。 テーブルAがあります。 そのテーブルAのレコードには一意のシーケンシャル番号でID(ID1とします)が付与されています。 そのテーブルAに対し、新たにID(ID2とします)を付与します。 新たに設定するID2はID2用にシーケンシャル番号をCREATEしinsert時にプログラムより付与していきます。 [質問] 現行すでにテーブルAに存在するレコードに対し、「ID1の昇順に」ID2をID2用のシーケンシャル番号より付与していきたいのですが1つのSQL文で組むことは可能でしょうか? すみません、うまく説明できていないのですが ご回答お願いします

  • Oracle
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • R_Moon
  • ベストアンサー率60% (9/15)
回答No.1

nyanko-maturiさん、こんにちわ。 >そのテーブルAに対し、新たにID(ID2とします)を付与します。 >新たに設定するID2はID2用にシーケンシャル番号をCREATEしinsert時にプログラムより付与していきます。 1つのSQL文でという事なので的外れかもしれませんが、「付与していく」という事は、テーブルAをID1の昇順に順読みしながら1件ずつID2を付与するようなイメージでループさせるというのではだめなんでしょうか? または、UPDATEする際の条件としてMIN関数を使用してID1の最小値を持ち、かつID2がNullのレコードを絞り込むというのはどうですか?

nyanko-maturi
質問者

お礼

ご解答ありがとうございます。 やっぱりID1でソートして ループでくるくる回しながらupdateするもんでしょうね(^^; とても参考になりました。 お忙しいところありがとうございました。

関連するQ&A

  • ID列を含むテーブルコピー、編集

    ID列を含む「テーブルA」の内容をコピー&コピーの一部項目を編集して、ID列はリセットして振り直しを行った後、「テーブルA」にINSERTするといった事をしたいのです。編集する項目、IDの項目はKEYになっている。 SQLリファレンスで調べてみましたが、SET IDENTITY_INSERT XXXX ON、DBCC CHECKIDENTなどの使い方がいまいち良くわからないのです。 1.「テーブルA」のIDENTITYをはずした形で、コピー先のテーブル「テーブルB」をCREATE。(レイアウトは全く同じ。) 2.「テーブルA」を全て、「テーブルB」(編集用)へINSERT。 3.「テーブルB」の一部項目を編集、「テーブルA」のID列に相当する項目を'1'から配番する。 4.編集後の「テーブルB」を全て、ID列を含む「テーブルA」にINSERT。 上記3、4項の方法が良くわかりません。 データテーブルは、「年度」・「履歴番号」(ID)・「その他項目多数」を持ち、編集方法は、「年度」を新年度に置換し、「履歴番号」を'1'から振り直したものを、「テーブルA」にINSERTしたいのです。 「履歴番号」(ID)の振り直しの条件はありません。レコードTOPから'1'から順に再配番されればいい。 やりたい事は単純なのですが。。。。初心者ですみません。 助言いただければと思い質問しました。

  • INSERT文とUPDATE文の使い分け

    いつもお世話になっております。 MYSQLで x_table ID SUBID  1  aaa 2 aaa 3 bbb 4 ccc というテーブルがあったとして、「IDが 1 かつ、SUB_IDが aaa」の項目が存在する場合はUPDATE、存在しない場合はINSERT、という形でSQLを使い分けたいと考えています。 現在は SELECT * FROM x_table WHERE ID=1 AND SUBID='aaa' というSQLでレコードの存在確認をし、その結果によりif文でUPDATE文とINSERT文を使い分けているのですが、レコードの存在確認とINSERTやUPDATEのSQLを一つにまとめる事が出来るようなやり方って無いでしょうか? 無さそうな場合は「無い」とだけでも答えていただけるとうれしいです。

    • ベストアンサー
    • PHP
  • テーブルの自動キー再割り当て

    以下sqlでテーブルhogeを作成し、idを自動キーにしています。 CREATE TABLE `hoge` ( `id` INT NOT NULL AUTO_INCREMENT, ........(省略).......... PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=sjis; このテーブルのレコード番号4を削除するとテーブルのidは 1,2,3,5(最終)になり, 新しいデータを追加(INSERT)するとidは 1,2,3,5,6(最終)とid番号4が欠番になります。 テーブルのidを1,2,3,4,5と続き番号に再割り当てして、新しいレコードがid番号6の挿入されるようにするにはどのようにすればよいでしょうか? sql文をご教示い頂きたくよろしくお願いします。

  • LAST_INSERT_IDの使い方

    お世話になります。 早速ですが 1、トランザクション 2、テーブルAにインサート 3、テーブルBにインサート 4、テーブルCにインサート 5、コミット のような処理の時に、テーブルAでインサートしたレコードの IDをテーブルBとCに入れたいので、テーブルBに入れる時に LAST_INSERT_ID()を使うと思い通りの処理になりました。 しかし、テーブルCにインサートする時にはLAST_INSERT_IDの 値はテーブルBのインサート時のIDとなり、テーブルAのIDでは ありません、当然ですが。。 こういった場合、テーブルAのインサートIDを取得保持するには どのようにすればいいのでしょうか? どうか、ご教示ください。

  • 空きのID番号を取得する方法

    いつもお世話になっております。 create table AAA( ID int(6) primary key not null auto_increment, DATA varchar(30), )engine=MyISAM; というテーブルにおいて、 insertをすると、IDが1から順に割り振られていきますが、 途中のレコードをdeleteすると、そこが空きのID番号となってしまい、 次にinsertすると、空き番号が残ってしまいます。 やりたいことは、その空き番号を有効活用するために、 auto_incrementを使用せずに、空き番号を適当に取得して、 insertをしたいのです。 何か効率的な良い方法をご存知の方がいらっしゃいましたら、 ご教授いただけると幸いです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • SQLServerのID列(自動連番)について

    PHPとSQL Serverでウェブアプリケーションを作っています。 例として、下記のようなテーブルを想定します。 テーブル名 users  user_id [int] ←主キー(IDENTITYプロパティを指定して、1ずつ増える連番)  name [char(10)] IDENTITYにより、INSERT INTO でuser_idの値を指定せずとも、一意のID値が割り振られます。 このINSERT処理は、PHPのmssql_queryでSQL文を発行しているのですが、 この時割り振られたuser_idが何であるかは、どうやって調べればよいのでしょうか。 IDENTITYを利用せず、INSERTする前にSELECT MAX(user_id)を発行して、 最も大きなuser_idを調べ、それを+1してINSERT、とすれば当然user_idは分かりますが、 せっかくIDENTITYの機能があるのに明らかに無駄な処理です。 どなたか分かる方、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 同じデータベース内で値の参照

    あるA,B,Cのテーブルがあり、 Aの主キーはシーケンシャル番号が振られています。 この値を参照し、B,Cのテーブルのフィールドに挿入したいのですが、 私のやり方は (1)まずAをInsertする (2)AでInsertしてできたシーケンシャル番号を取得し、 (3)BをInsertする (4)CをInsertする と少しややこしい方法しか思いつきませんでした。 何かよいアイデアがあれば教えていただけたら、ありがたいです。

  • なければInsert、あればUpdate …ってできますか?

    MySQL 3.23.49-nt を使用中です。 とあるテーブルを、3つのサーバで使用中で、このテーブルを一つのサーバで更新して、他のサーバへ レコードをコピーしたいのですが、「他のサーバ」に既に同じキーの レコードが存在する可能性があります。 こちらで更新したいサーバ(A)のテーブルの内容をこんな感じだとします。 キー番号 | SEQ | 項目A | 項目B ---------+-----+-------+------ 1001 | 1 | 11-AA | 11-BB 1001 | 2 | 12-AA | 12-BB 1002 | 1 | 21-AA | 21-BB 1002 | 2 | 22-AA | そして、コピー先のサーバ(B)のテーブルの内容をこんな感じだとします。 キー番号 | SEQ | 項目A | 項目B ---------+-----+-------+------ 1001 | 1 | 11-BA | 11-XX 1002 | 1 | 21-BA | 21-YY 1002 | 2 | | 22-YY 「キー番号」「SEQ」「項目A」だけを、サーバAと同一にしたいと考えています。 キー番号とSEQが同一のレコードが存在する場合、サーバBの「項目B」は変えたく ありません。 すなわち、サーバ(B)が キー番号 | SEQ | 項目A | 項目B ---------+-----+-------+------ 1001 | 1 | 11-AA | 11-XX ---- 項目Aを更新 1001 | 2 | 12-AA | ---- レコードをINSERT 1002 | 1 | 21-AA | 21-YY ---- 項目Aを更新 1002 | 2 | 22-AA | 22-YY ---- 項目Aを更新 のようになって欲しいのです。 そこで、 「キー番号="1001"、SEQ = "1" のレコードがあれば、そのレコードの項目Aに'11-AA'をセットしてUPDATE。 レコードがなければ、キー番号="1001"、SEQ = "1"、項目A='11-AA'のレコードをINSERT。」 というようなMySQLの命令文(?)を書けないかなぁ?と、一生懸命参考書をひっくり返してもがいています。 できるようなできないような... 無理でしょうか?

    • ベストアンサー
    • MySQL
  • 複数テーブルで ID の一意性を保つ

    Debian GNU/Linux 3.1 で psql 8.1.2 を使用しています。 下記の要領でテーブルを作成し、2つのテーブルでIDが重ならないようにしようと意図しました。 CREATE TABLE t1 ( t1_id int2 UNIQUE NOT NULL, t1_name text NOT NULL ); NOTICE: CREATE TABLE / UNIQUE will create implicit index "t1_t1_id_key" for table "t1" CREATE TABLE CREATE TABLE t2 ( t2_id int2 UNIQUE NOT NULL, t2_name text NOT NULL ); NOTICE: CREATE TABLE / UNIQUE will create implicit index "t2_t2_id_key" for table "t2" CREATE TABLE CREATE FUNCTION unique_t12_id(int2) RETURNS BOOLEAN AS 'SELECT NOT ( EXISTS(SELECT * FROM t1 WHERE t1_id = $1) AND EXISTS(SELECT * FROM t2 WHERE t2_id = $1) );' LANGUAGE SQL; CREATE FUNCTION ALTER TABLE t1 ADD CONSTRAINT con_unique_t12 CHECK (unique_t12_id(t1_id)); ALTER TABLE ALTER TABLE t2 ADD CONSTRAINT con_unique_t12 CHECK (unique_t12_id(t2_id)); ALTER TABLE ところが実際は上手くいきませんでした。 INSERT INTO t1 VALUES(1, 'test1'); INSERT 0 1 INSERT INTO t2 VALUES(2, 'test2'); INSERT 0 1 INSERT INTO t2 VALUES(2, 'test3'); ERROR: duplicate key violates unique constraint "t2_t2_id_key" # ここまでは期待通りの挙動です INSERT INTO t2 VALUES(1, 'test4'); INSERT 0 1 ここで制約が働いて欲しかったのですが、素通りでINSERTされています。 下記のように、操作後の関数の戻り値は「偽」なのでこの操作は制約に引っかかると思うのですが 何故意図したように動かないのでしょうか。 SELECT *,unique_t12_id(t2_id) FROM t2; t2_id | t2_name | unique_t12_id -------+---------+--------------- 2 | test2 | t 1 | test4 | f (2 rows) スペースが詰まって読みづらい箇所もありますが、よろしくお願いします。

  • oracle10g update件数の取得方法

    oracle10g update件数の取得方法 pl sql(stored procedure)で複数のupdate文を適用します。update後にupdateしたレコード件数をログテーブルにinsertしたいのですが、updateしたレコード件数を取得する方法はありますか?