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

このQ&Aのポイント
  • テーブルAの内容をコピー&コピーの一部項目を編集して、IDをリセットして振り直し、テーブルAにINSERTしたいです。
  • テーブルAのIDENTITYを外し、同じレイアウトのテーブルBを作成します。テーブルAのデータをテーブルBに全てINSERTし、一部項目を編集します。編集後のテーブルBをテーブルAにINSERTします。
  • テーブルAのデータを編集し、ID列に相当する項目を1から振り直した後、テーブルAにINSERTします。
回答を見る
  • ベストアンサー

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'から順に再配番されればいい。 やりたい事は単純なのですが。。。。初心者ですみません。 助言いただければと思い質問しました。

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

通常は以下のように手順3、4は一緒にやります。 SELECT * INTO TABLEB FROM TABLEA GO TRUNCATE TABLE TABLEA GO INSERT INTO TABLEA(年度,項目1,項目2,...) SELECT 2010,項目1,項目2,... FROM TABLEB ORDER BY 履歴番号 GO もしかして、年度+履歴番号で主キーになっていて、同じテーブルに2009年度と2010年度を両方収録し、しかもそれぞれの年度で1から連番を振るという意味ですか? その場合は「TRUNCATE TABLE TABLEA」の代わりに、「DBCC CHECKIDENT (TABLEA,RESEED,0)」を実行し、2010年度も1から振られるようにします。 (こういう使い方はあまりお勧めではないですけど)

nene199908
質問者

お礼

ありがとうございます

関連するQ&A

  • IDENTITY列の複数テーブルへのINSERT

    テーブルAへINSERTをした場合のIDENTITY列の値を 同じトランザクション内で テーブルBの別のフィールドへINSERTしたいのですが、 どのようにSQLを書けばよいのか、困っています。 どうか、ご教示お願い致します。 INSERT INTOTABLE_A (NAME_A) VALUES ('あいうえお') ↓ INSERT INTOTABLE_A (A_ID,NAME_B) VALUES (取得したA_ID, 'さしす') INSERT INTOTABLE_A (NAME_A) VALUES ('かきくけこ') ↓ INSERT INTOTABLE_A (A_ID,NAME_B) VALUES (取得したA_ID, 'たちつ') INSERT INTOTABLE_A (NAME_A) VALUES ('さしすせそ') ↓ INSERT INTOTABLE_A (A_ID,NAME_B) VALUES (取得したA_ID, 'なにぬ') TABLE_A ID NAME_A 5  'あいうえお' 6  'かきくけこ' 7  'さしすせそ' TABLE_B ID A_ID NAME_B 1  5  'さしす' 2  6  'たちつ' 3  7  'なにぬ'

  • 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
  • insert into select で別テーブルのID分挿入したい

    SQLでこんなことは可能でしょうか。 列 IDとTEXT をもつテーブルA と、 列 IDをもつテーブルBがあります。 テーブルAに、テーブルBのID分のデータを挿入したいです。 TEXTはテーブルAのID=1のTEXTデータを全ての列に挿入します。 このような場合のSQL文を調べてるのですが、 なかなかわからなくて困っています。 insert into select b.id,a.text from tableA as a, tableB as b でもうまくいきませんでした。 何かいい方法はないでしょうか? 回答お待ちしております。

  • identity属性の列に自動採番(SQL)

    ID、name、seibetuという列を持つ、membersというテーブルがあり、INSERT文を実行してテーブルに値を入れたいと考えています。 IDがIs IDENTITYの値がTRUEになっている列で、NOT NULLです。 以下のクエリを実行したところ、IDにNULLが入るといったエラーが起きます。 SET IDENTITY_INSERT members ON INSERT INTO members (seibetu, name, ID) VALUES ('男', 'すずき', @@IDENTITY) 何か問題があるのでしょうか? お分かりの方いらっしゃいましたらよろしくお願いします。

  • マージレプリケーション ID値の返し方

    知識が浅く、自力で解決できないのでご協力お願い致します。 SQL Server2005を使用しています。 サーバーAとサーバーBで、マージレプリケーションで同期をとっているテーブルがあります。 Aの方のテーブルにストアドプロシージャを実行してINSERTし、そのID値(シーケンス番号)を直後にアウトプットとして取得したいのですが、どうも上手くクエリがうまく書けません。 例: AとBのあるテーブルには自動付番のシーケンス番号60までデータがあります。 AにINSERTして新規に追加されたデータのシーケンス番号は61となるので アウトプットとしてその61を返したいのですが、 マージの影響でコミット前のIDを返すのでしょうか、2など全く違った値が返ってきます。 実際にテーブルを確認すると、ちゃんとAもBもシーケンス番号61で新規追加されています。 現状のクエリではINSERT文のあとに 『SET @no_seq = @@IDENTITY』と記述していて、 マージレプリケーションを解除していれば@no_seqに正しいID値を返します。 他には ・@no_seq = SCOPE_IDENTITY ・@no_seq = IDENT_CURRENT('table_name') を試しましたが結果は同じでした。 クエリの書き方なのか、あるいは マージレプリケーションの設定にも詳しくないので なにか原因に心当たりがあれば教えて頂きたいです。 よろしくお願い致します。

  • AテーブルからBテーブルへの展開

    表題のとおりAテーブルのデータを展開し、 BテーブルへINSERTするというPLSQLを考えています。 以下ような感じです。 Aテーブル No 列A1 列B1 列C1 列D1 列A2 列B2 列C2 列D2 列A3 列B3 列C3 列D3 -------------------------------------------------------------- 上記表のデータを Bテーブル No 列BA 列BB 列BC 列BD ------------------------- No 列A1 列B1 列C1 列D1     ←列名の末尾が1のもの No 列A2 列B2 列C2 列D2     ←列名の末尾が2のもの No 列A3 列B3 列C3 列D3     ←列名の末尾が3のもの と、いう感じでBテーブルへ。 Aテーブルの列名は”列A1”のように末尾に数字がついておりBテーブルへは 末尾が同じものを1レコードとしてINSERTします。 これを実現する方法として CURSOR csr IS SELECT * FROM ( SELECT 列A1 ,列B1 ,列C1 ,列D1 FROM Aテーブル UNION SELECT 列A2 ,列B2 ,列C2 ,列D2 FROM Aテーブル UNION SELECT 列A3 ,列B3 ,列C3 ,列D3 FROM Aテーブル ); 上記のようにカーソルで処理してINSERTする以外に方法がありますでしょうか 因みにこの例では1~3項目ですが実際には1~15項目まであります。 BテーブルへINSERTする列数も13列存在します。 DBはORACLE9iです

  • エクセルVBA、列のコピーについて

    VBAについて助けてほしいことがございます! VBA初心者なので、ひょっとしたらレベルの低い質問かもしれず申し訳ないのですが、VBAに詳しい方がいらっしゃれば教えて欲しいことがあります。 下記の前提を含めた作業内容をVBAのコードとしてまとめる事は出来るのでしょうか? 1列目(A1,B1,C1,D1…)にキー項目(名前、番号、地域、住所、ID…)、2列目以降にキー項目のデータが入力されています。 【作業内容】 「ID」の項目の列には、「番号」の列の文字をコピーして貼りつける(キー項目は上書きせずにIDのまま)。 【前提】 ・キー項目の列は固定されていない(B列が番号の時もあれば、住所の時もある)ので、文字を基準にコピー作業をする ・「キー項目が空欄にぶつかったら、検索を終了」という事をループに入れる(キー項目数は変動するため) ・2列目以降の全てのデータをに張り付ける」という事をコードに入れる(2列目以降のデータの列数も変動する且つ途中に空欄も含むため)

  • 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を取得保持するには どのようにすればいいのでしょうか? どうか、ご教示ください。

  • 列コピーについて

    VBAを利用した複数必要列をコピーする方法を教えて下さい。 シート1に入っているデータで 1行目には、項目名が入っています。 項目数はMAX200個前後です。 毎月各担当者からデータが入ったExcelブックを受け取り 必要な列だけを残して、データをコピペして頑張っていたのですが、 毎回列並びが異なるのと、担当者によっては抽出してくる 項目が違うため担当者ごとに修正するのが手まで困っております。 作業を以下の様にしたいです。 各ブックに入っている項目数はバラバラですが、最終的に必要な項目は 各担当者で必ず残してもらえています。 但し各担当者によって列並びがバラバラで困っています。 (1)例えばシート1に以下の様にデータを入力しておく (担当者で) A B(列) (行) 1 test 2 支店 3 営業担当者 4 番号 (2)シート2は各担当者より提出されるデータをまるっと貼り付ける A B(列) (行)test 日付 支店 営業担当者 エリア 番号 住所 電話番号 1 2 2行目以降はデータだけが入っている 3 4 ★行いたいのは(2)に入っているデータより★ (1)に入力されているB列の2行目以降に入っている項目キーと一致するデータを (2)からコピーしてシート3へ必要な項目が入っているデータを列ごと貼り付けたい 最終イメージーはにシート2に入っているデータから、 シート1には入っている項目だけのデータを シート2からコピーしたデータだけがシート3に残るようにしたいです。 以下がシート3で最終的に残るデータとしたい A(列)   B(列) C(列) D(列) E(列) F(列) → 以降項目数が続く (行)test  支店   営業   担当者 番号    電話番号 1 2 2行目以降はデータだけが入っている 3 4 ↓ 以降 データが入っている 必要データ以外は削除としたのですが、 項目数が多く以下の内容ではうまくいきませんでした。 ※例として書いているのが項目名が4つとしていますが、 必要な項目数はおよそ30前後になります。下記の内容では、 文字数の関係でエラーが出た為必要な項目をコピーして別シートへ貼り付ける方が よいとアドバイスをいただいたのですがうまく書けませんでした。 Dim rng As Range Set rng = Cells.Find("test、支店、営業担当者、番号", , xlValues, xlWhole) If Not rng Is Nothing Then Range(rng.Offset.EntireColumn, rng.Address).Delete End If Set rng = Nothing どのようにすれば必要な項目を列ごとコピーして別シートへ貼り付けることができるでしょうか。 是非お力添えをお願い致します。

  • テーブルの中身を違うテーブルへコピー

    お世話になります。 SQLについて質問があるのですが・・・。 Aというテーブルがあり、何件かデータが入っています。 そのAテーブルにフィールドを2つ新たに追加したいのです。 ALTER TABLEは使わずに、 以下の様な操作をしたいと考えております。 1:Aテーブルを違う名前に変更。  もしくはテーブルを丸々コピー。 2:テーブルBを作成。   (テーブルAのフィールドに2つフィールド追加した内容) 3:テーブルBにテーブルAの内容を丸々コピー。   その際、新規に追加した2つのフィールドには、初期値として、何かの文字or数字を入れる。 4:Aテーブルを削除 と、いう感じです。 作成はINSERT、削除はDROPを使えばいいのかなーって 思っているのですが、 テーブル名の変更や、テーブルの内容のコピーが ちょっと分かりません。 上記について、ご教授の程、よろしくお願いします。 なお、DBにはSQL Serverを使用しています。