• ベストアンサー

オラクルでデータベースに項目を追加する場合に

オラクル初心者です教えてください。 バージョンが関係あるのかは分かりませんが、8.1.7です。 AAAテーブルに10個の項目があり、真中に項目を追加する場合に、今入っているデータを生かしたい場合にどうやってやればよいのでしょうか? ↓領域を増やす場合などはこうやっているのですが  項目がずれているので駄目ですよね? CREATE TABLE BBB AS SELECT * FROM AAA DROP TABLE AAA CREATE TABLE AAA(真ん中に項目追加後) INSERT INTO AAA SELECT * FROM BBB やっぱりINSERT分に項目を全部書かないとだめなのでしょうか?

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

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

かかれているSQL文の中に2個所アスタリスクがありますが、どちらかで項目を並べればいいですよ。 CREATE TABLE BBB AS SELECT F1,F2,NULL,F3 FROM AAA DROP TABLE AAA CREATE TABLE AAA(真ん中に項目追加後) INSERT INTO AAA SELECT * FROM BBB とか、 CREATE TABLE BBB AS SELECT * FROM AAA DROP TABLE AAA CREATE TABLE AAA(真ん中に項目追加後) INSERT INTO AAA SELECT F1, F2, NULL, F3 FROM BBB

Ref16570
質問者

お礼

ご意見ありがとうございます。 テーブルを作成する時に、既に項目を追加すると言うこととですね。 INSERT INTO.....VALUESと書くよりは 手間が省けますね。

その他の回答 (1)

回答No.2

>やっぱりINSERT分に項目を全部書かないとだめなのでしょうか? 違う方法でも項目はすべて書く必要があります。例を書きますので参考にしていただけたらと思います。 追加するフィールドをADD_FIELD VARCHAR2(100)とします。。 /*1.現在のテーブルの最後にフィールドを追加 */ alter table AAA add (ADD_FIELD VARCHAR2(100)); /*2.AAAを基に新規テーブルを作成追加 */ create table BBB as select [Field1],...ADD_FILED,..[Field10] from AAA /*3.BBBをAAAにする */ drop table AAA cascade constraints; rename BBB to AAA; ちなみに2.で必要とされるフィールド名の取得は select COLUMN_NAME from USER_TAB_COLUMNS where TABLE_NAME = 'AAA' で全て取れると思います。

Ref16570
質問者

お礼

ご意見ありがとうございます。 はじめにテーブルを追加して、 コピーする際に順番を変えて変名するんですね。 CASCADE CONSTRAINTS RENAME というコマンドは知りませんでした。 勉強になりました。

関連するQ&A

  • SELECT FOR UPDATE で該当レコードがなかった場合

    SELECT FOR UPDATE ですが、該当レコードのみ ロックすると思うんですが、 該当レコードがない場合は、 ロックできないんでしょうか? たとえば、(COLUMN_BBB が PK として) SELECT * FROM TABLE_AAA WHERE TABLE_AAA.COLUMN_BBB = 'BBB' FOR UPDATE で、そもそも SELECT * FROM TABLE_AAA WHERE TABLE_AAA.COLUMN_BBB = 'BBB' となるレコードがない場合でも、 他トランザクションによる 該当レコードの INSERT を排他防御できるのか無理なのか、 教えていただけたらありがたいです。 すみません、時間的余裕があまりないので、 (すぐに回答ほしいです)でアップします。

  • oracle9i distinct

    select distinct 1 as aaa, bbb from table_a aaa     bbb -------------------------- 1      a 1      b 1      c この場合の「distinct 1」というのは table_aの1列目でdistinctするという 意味でいいのでしょうか? でもdistinct 2 とすると、aaaの列の値が2になるだけなのですが・・。 すみませんがdistinct 1 の意味を教えていただけますでしょうか。

  • オラクルSQL文のCOUNT関数について

    SELECT COUNT (*) AS XXXX FROM AAA,BBB WHERE AAA.AAA = BBB.BBB AND ・・・・ ・・・・ やりたい事は、AAAテーブルだけのカウントをしたいのですが 現状、BBBのカウントもしてしまいます。 BBBはWHEREでAAAに対して比較だけを 行いたいのですが、この場合どうやったらいいのでしょうか。

  • oracleからSQL Serverへの移行

    oracleからSQL Serverへ移行することになったのですが、副問い合わせで定義したテーブル同士を外部結合するSQL構文が、うまく実現できず、ご教授して頂きたくよろしくお願いします。 下記、oracle 構文をSQL Server構文へ書き換えたい。 select * from (select cal1,cal2,cal3 from tbl1,tbl2 where cal1 >100) aaa, (select cal1,cal2,cal3 from tbl1,tbl2 where cal1 <=100) bbb, tbl3 where aaa.cal1 = bbb.cal1(+) and aaa.cal2 = bbb.cal2(+) and aaa.cal3 = bbb.cal3(+) and aaa.cal1 = tbl3.cal1 よろしくお願いします。

  • oracleユーザーの権限確認方法について

    お世話になります。 例えばですが、oracleでsysユーザからaaaというユーザーを作成し、 selectやcreateなどの権限を付与したとします。 そこでaaaユーザーでログインして、aaaユーザーが行うことのできる 権限を調べたいと思ったのですが、いまいちわかりません…。 (1)select * from session_privs; ではcreate系の権限は表示されますが、select系(DML文)の権限が何を付与されているか表示されませんでした。 (2)select * from user_sys_privs; でもselect等の権限の確認はできませんでした。 (3)select * from user_tab_privs; では一件も出てきませんでした。 上記3つは何か間違えているのでしょうか? それとも他にも何か調べ方があるのでしょうか? よろしくお願い致します。

  • 副問い合わせの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); とはできないみたいですので… どうかご教授宜しくお願いします。

  • TO_NUMBERの結果は、カラムに追加できない?

    いつもお世話になっています。 TO_NUMBER実行時、結果はnumeric型で取得できると思うのですが、 その値をカラムに追加することはできるのでしょうか? insert into number2 values((select numberStr,TO_NUMBER (numberStr,'000.000') from number),'aaa'); 実行すると、 副問い合わせは1列のみを返さなければなりませんというErrorが生じます。 なのでwhere句を追加しましたが、結果は同じです。 実行したsqlは、 create table number ( count integer not null primary key, numberStr varchar(20) not null ); create table number2 ( no numeric not null primary key, numberS varchar(30) not null); insert into number values(5,'555.55000'); insert into number2 values((select numberStr,TO_NUMBER (numberStr,'000.000') from number where count=5),'aaa'); です。 宜しくお願いします。

  • すっきりとしたSQL文にしたいのですが

    Oracle9iにてテーブルのデータを更新しようと思っています。 目的としてはAAAのカラムa1とBBBのカラムb1が同一なレコードである場合、 AAAのa2にBBBのb2を更新したいのですが、 <条件> AAA:テーブル1 BBB:テーブル2 a1:CHAR b1:CHAR a2:VERCHAR b2:VERCHAR すべて必須で桁数は10 UPDATE AAA SET AAA.a2 = ( SELECT BBB.b2 FROM BBB WHERE AAA.a1 = BBB.b1) WHERE AAA.a1 = ( SELECT BBB.b1 FROM BBB WHERE AAA.a1 = BBB.b1) ; いまはこんな無駄の多そうなSQLしか分かりません。 この他にも条件が2つ追加される予定なので もっとすっきり更新できる方法を教えていただけませんでしょうか? よろしくお願いします。

  • SQLで他のテーブルに無いIDの抽出

    MySQLを使っています。 下記は、 1.テーブルaaaには、存在するidのものが、 2.テーブルbbbには、存在しない、 3.テーブルaaaのレコードを抽出したいものです。 "SELECT DISTINCT aaa.*" + " FROM aaa" + " WHERE (aaa.flag = false)" + " AND NOT EXISTS (SELECT * FROM bbb" + " WHERE (aaa.id = bbb.id) AND (bbb.flag = false))" ですが、実行すると、下記エラーがでます。 SQLException:Base table or view not found, message from server: \"Unknown table 'bbb' in where clause" どうすればよいのでしょうか?

    • ベストアンサー
    • MySQL
  • 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