• ベストアンサー

テーブル属性変更後のデータ移動

あるテーブルのキー項目をnumberからvarchar2に変更します。 テーブルの全件を仮テーブルを作成してコピー 元テーブルをTRUNCATE後、型変換 仮テーブルのデータを元テーブルへコピー という流れで、それぞれSQL文はできましたが、 仮テーブルのデータを元テーブルへコピーを実現する SQLが思い浮かびません。 insert into AAA select * from BBBだと、属性もコピーされてしまう? とのことで、ご教授お願いいたします。

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

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

INSERT INTO 新テーブル SELECT 項目1, ... TO_CHAR(項目n,'FM999...'.), ... FROM 旧テーブル; の要領でやればいいのでは。 ただし、制約、インデックスはいったん外してINSERTしてから、ALTER SESSION SET SORT_AREA_SIZE = ... でソートエリアを拡大してから再作成したほうがいいと思います。

関連するQ&A

  • 副問い合わせのinsert文

    いつもお世話になっています。 insert文の副問い合わせのことでお聞きしたいのですが、 ■通常のinsert文 insert into AAA values(aaa,bbb,ccc); 上記のsqlを副問い合わせにした場合(aaaに別テーブルからの検索結果を入れたい場合)どういうSQL文になるでしょうか。 参考書等を参照すると、副問い合わせの場合はvaluesを省略する(使えない?)と記述がありました。 insert into AAA values ( aaa IN (SELECT bbb from BBB where ccc = ddd),bbb,ccc); とはできないみたいですので… どうかご教授宜しくお願いします。

  • SQLローダーで複数のCSVファイルのデータを一つのテーブルにInsertしたい

    お世話になります、 以下のようにデータをSQLLDRでインサートしようと思っているのですが、複数のCSVファイルのデータを一つのテーブルにInsertしたい場合にどのようにすればいいか教えてください。 --バッチファイル sqlldr userid=fmwuser/fmwuser@fmw001 control=ctl/AUTHORITY.CTL log=section1.log data=csv/AUTHORITY.csv --CTLファイル LOAD DATA TRUNCATE INTO TABLE AUTHORITY FIELDS TERMINATED BY ',' ( AUTHORITYCODE ,AUTHORITYNAME,EXECUTIVE) CTLファイルでTRUNCATEを付けるとテーブルを初期化してからインサートするからむりですよね... TRUNCATEをはずすと、データが入っているテーブルに対してSQLLDRは使用できないと怒られるし... CSVファイルを一つにまとめるしかないのでしょうか?

  • データがないテーブルの問い合わせが遅い

    現在、会計システムの運用をやっていて一部のプロセスについて パフォーマンスチューニングをやっています。 調査を進めていくと一時的に使うTEMPテーブルで、既にDELETEされて データがないにも関わらず select * from (一時的に使うTEMPテーブル); というSQLのプランをとるとCOSTが高く(300くらい) 返答も遅いものが見つかりました。 ほとんどデータがないテーブルから抽出するSQL文のCOSTは たいてい5以下になっており、SQLの返答も非常に早いのですが上記理由が分からない状態で、 何か悪影響があるのではないかと疑っています。 以下の2点について推測でも結構ですので、 考えられることがあれば教えてもらえると うれしいです。 1.原因として考えられそうなこと 2.有効そうな対策   (夜間でtruncateしてanalyze処理をかける、等) 【TEMPテーブル使用方法詳細】 プロセス実行中に一時的にINSERTされ、プロセスの最後でDELETE されます。 10万行程度INSERTされることがあります。 何か他に必要な情報がありましたら 教えてください。 よろしくお願いします。

  • フィールドサイズの変更方法について

    お世話になります。SQL初心者です。 VB5+ACCESS97でデータが入っているテーブルのある特定のテキスト型の列サイズを5から6に変更する必要が出てきました。 テーブル名を変えたくないのですが、 1.列サイズを変更した新テーブルをCREATE 2.元テーブルを全項目SELECTして新テーブルにINSERT 3.元テーブルをDROP 4.新テーブルと同じ属性で元テーブル名で新々テーブルをCREATE 5.新テーブルから全項目SELECTして新々テーブルにINSERT 6.新テーブルをDROP この方法しかないでしょうか。コピーのコピーで時間がかかりそうで悩んでます。 手元の書籍ではACCESS97では、テーブル名のリネームとか、ORACLEのALTER TABLEのような属性変更ができないような気がするのですが、もしコマンドをご存知でしたら併せて教えてくださると、とても助かります。 よろしくお願いします。

  • JAVA+MySQLのテーブルロックについて

    Java + MySQL5(MyISAM)でテーブルをロックする処理をかけようと 試みているのですが、上手くロックが掛からずにエラーになります。 テーブル「AAA」と「BBB」にロック処理を行おうと思います。 Connection con = null; Statement ps = null; String sql = null; Class.forName("com.mysql.jdbc.Driver"); con = (Connection) DriverManager.getConnection(url, user, pass); ps = con.createStatement(); sql = "LOCK TABLES AAA WRITE,BBB WRITE"; int a = ps.executeUpdate(sql); sql = "UPDATE AAA SET ~省略~"; a = ps.executeUpdate(sql); sql = "INSERT INTO BBB SET ~省略~"; a = ps.executeUpdate(sql); sql = "UNLOCKS TABLES"; a = ps.executeUpdate(sql); 上記の記述でどこに誤りがあるのでしょうか? お知恵を拝借できないでしょうか。 宜しくお願い致します。

  • テーブルに入っているデータと重複チェックしたい

    やりたいこと: phpを実行して取得したデータの内容と既にDBのテーブルに格納されているデータを 比較して、 異なっていれば、新しいデータとして INSERT INTO文で テーブルにデータを登録する。 同じであれば、登録しない。 という処理がしたいです。 $sql = "select * from hoge where url= $page_uri"; $kakunin = mysql_query($sql , $db ); if ( $page_uri == $kakunin ){ //同じデータならスキップ break; } else{ $sql = mysql_query("INSERT INTO hoge VALUES (0,'$page_uri','$pon')"); と書いているのですが、以下のエラーが出てしまいます。。 Fatal error: Cannot break/continue 1 level in /www/xx.php on line 42 これは、breakは使えないよ ってことでしょうか? breakでなくても やりたいことが実現できればこだわりはないのですが、、 アドバイスよろしくお願いします。

    • 締切済み
    • PHP
  • Load Data INFILE構文について

    お疲れ様です。 いつもお世話になっております。 既にデータが入っているテーブルに対して、CSVをインポートし、該当のレコードだけUPDATEをかけたいと思っています。 ID,名前,備考,属性 1,aaa,, 2,bbb,BBB, 3,ccc,,zok3 4,ddd,,zok4 5,eee,EEE, というデータがあり、これに対して 1,,,zok1 2,,,zok2 5,,,zok5 6,fff,FFF,zok6 というデータを持つcsvを突っ込もうと思っています。 その場合、IDが1,2,5の名前や備考はNULLで上書きされてしまうのでしょうか? また、既存のテーブルにないcsvのID6は入れないようにしたいのですが、これだとLOAD_DATA_INFILEというよりただのUPDATEです。 これらのデータが100万件あって、属性の抜けだけを補完し、既にテーブルから消されているデータはINSERTしたくないのですが、何かスマートな方法はないでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データ取得

    name*****key1****key2****date ------------------------------- AAA*******1*******1*****2003/01 BBB*******2*******2*****2002/12 AAA*******1*******2*****2003/01 BBB*******1*******2*****2002/11 BBB*******2*******2*****2002/11 AAA*******2*******2*****2003/01 AAA*******2*******2*****2002/12 ------------------------------- (※全てのフィールドが同じ情報のレコードはない) ****は意味はありません。表を見やすくするために書いただけです。 上記のテーブルから下記のデータを取得したいと 考えています。 AAA*****2002/12*****1 AAA*****2003/01*****3 BBB*****2002/11*****2 BBB*****2002/12*****1 name列とdate列の重複しないレコードの件数を取得したいのですが どのようなSQLを記述すればよろしいでしょうか?

  • テーブルのカラムの属性を変えるには

    Interbaseでデータベースのあるテーブルのカラム(項目)の属性を xxx CHAR(10) CHARACTER SET SJIS_0208から xxx CHAR(20) CHARACTER SET SJIS_0208に変更させるにはどのようなSQL文を書いたらいいのでしょう? 尚、テーブルにはもうデータが入っているので、dropはしたくありません。 宜しくお願いします。

  • 複数テーブルのMAX値の行データを取得したい

    テーブルA、B、Cとも共通して以下のカラムを持っています。 SAGYO_NO (VARCHAR) SAGYO_DT(DATE型) TANTO (VARCHAR) NAIYO(VARCHAR) SAGYO_NOを指定したA、B、Cのうちで(WHERE SAGYO_NO = '01')、 SAGYO_DTが最新のものの、 SAGYO_DT、TANTO、NAIYOを一回のSQLで取得したいのですが、 うまくできなくて困っています。 いい案がありましたらお願いします。 (例) テーブルA 01 2011/03/01 AAA BBB 01 2011/03/08 CCC DDD テーブルB 01 2011/03/05 EEE FFF テーブルC 01 2011/03/02 GGG HHH ⇒上記の場合、テーブルAの'2011/03/08','CCC','DDD'を取得したいです。 よろしくお願いいたします。