質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

Q&A

解決済

2回答

8917閲覧

view はcreate table as select できるのか?

tshizuku03

総合スコア38

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

0グッド

1クリップ

投稿2016/02/20 04:55

こんにちは。
oracle11.2 の質問です。

表題のとおりなのですが、
2つのテーブルと、その2つのテーブルを結合してViewを作成しました。
viewのバックアップを作成したいのですが、以下のやり方は正しいでしょうか??
viewは実態ではなく仮想表だと思うので、正しい方法なのか悩んでます。
何かご意見いただけると幸いです。

CREATE TABLE hoge.emp_view_bk SELECT * FROM hoge.emp_view;

■テーブル:emp
create table hoge.emp
(
emp_id char(3) ,
emp_name varchar2(10),
constraint pk_emp primary key( emp_id )
)

■テーブル:emp2
create table hoge.emp2
(
emp_id2 char(3) ,
emp_id char(3) ,
emp_name2 varchar2(10),
constraint pk_emp2 primary key( emp_id2 )
)

■ビュー:emp_view
CREATE VIEW hoge.emp_view AS
SELECT
emp.emp_id,
emp2.emp_id2,
emp.emp_name,
emp2.emp_name2
FROM
hoge.emp emp,hoge.emp2 emp2
WHERE
emp.emp_id = emp2.emp_id
WITH CHECK OPTION;

以上、どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

簡単な例だったので実験してみました。
ViewからのCREATE TABLE AS SELECTでは、
ViewのSELECT結果のテーブル実表が作成されるようです。

viewのバックアップを作成したい

との事ですが私にはViewの実行結果をバックアップする事、
もしくはViewで見える結果の元テーブルをバックアップする事の
両方に解釈出来てしまいました。

もし前者の解釈であれば今回の方法で良いと思いますが、
後者の場合はemp, emp2のそれぞれを個別に
バックアップをとる必要があります。

投稿2016/02/20 13:03

nabe3

総合スコア345

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tshizuku03

2016/02/21 06:21

お返事が遅くなり、申し訳ありません。 ご回答ありがとうございました。 >との事ですが私にはViewの実行結果をバックアップする事、 >もしくはViewで見える結果の元テーブルをバックアップする事の こちらは、前者になります。 具体的に今回やりたいことは、下記の通りとなります。 目的:viewへデータ更新(UPDATE)したい。 1.バックアップテーブル作成 2.viewへデータ更新 3.万が一、元に戻したい場合は1のバックアップテーブルからデータを元に戻す 実は、元テーブルはデータサイズが大きいので、 emp,emp2のテーブルをまるごとバックアップすることはできるだけ避けたいのです。 なので、Viewで抽出したデータ分だけバックアップできればと考えています。
nabe3

2016/02/22 03:59

すでに他の回答で書かれていますが、新規登録や削除が発生せず 更新のみとの事でしたら上記1~3の手順で問題ないと思います。 ただしバックアップから戻すに際して注意点があります。 テーブル定義的にはemp2表には同一emp_idが複数登録できます。 emp2表に同一のemp_idが複数存在する状態で、 emp2表のemp_id2を更新してしまうと更新した値によっては バックアップから戻せなくなります。 例) emp_id | emp_id2 | emp_name | emp_name2 100 | 020 | Steven | Matthew 100 | 022 | Steven | Karen emp_view.emp_id2 '022' → '023' に、 emp_view.emp_name2 'Karen' → 'David' に更新 emp_id | emp_id2 | emp_name | emp_name2 100 | 020 | Steven | Matthew 100 | 023 | Steven | David この状態ではemp2.emp_id2 '022' が削除されて、 emp.emp_id2 '023' が新規登録のような位置づけになりますので、 元に戻せなくなります。 emp_view.emp_name2のみしか更新しないのであれば問題ありません。
tshizuku03

2016/02/22 13:44

お返事ありがとうございました。 他の回答にもコメントしましたが、やりたい事は >新規登録や削除が発生せず >更新のみ になります。 また、emp_view.emp_name2のみしか更新しません。 なので、バックアップテーブルはViewからのCREATE TABLE AS SELECTで ViewのSELECT結果のテーブル実表を作成しようと思います。
guest

0

私もviewからas selectによるテーブル作成は実施した事は無いですが、おそらくテーブル作成自体は上手くいくと思います。

ただ、作成出来たバックアップテーブルはどの様な意図で使用されるのでしょうか?
バックアップタイミングのviewとして見えていたデータを取っておきたいのでしたら良いかと思いますが、データを戻せる様に取っておくという「バックアップ」として取りたいのでしたら元テーブルのデータまるごとを取っておくべきだと考えます。

投稿2016/02/20 10:57

Tira

総合スコア91

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tshizuku03

2016/02/21 06:25

お返事が遅くなり、申し訳ありません。 ご回答ありがとうございました。 >作成出来たバックアップテーブルはどの様な意図で使用されるのでしょうか? バックアップタイミングのviewとして見えていたデータを 元に戻せる様取っておく為に、バックアップテーブルを作成したいです。 具体的に今回やりたいこと 目的:viewへデータ更新(UPDATE)したい。 1.バックアップテーブル作成 2.viewへデータ更新 3.万が一、元に戻したい場合は1のバックアップテーブルからデータを元に戻す 実は、元テーブルはデータサイズが大きいので、 emp,emp2のテーブルをまるごとバックアップすることはできるだけ避けたいのです。 なので、Viewで抽出したデータ分だけバックアップできればと考えています。 viewとして見えていたデータをバックアップするには、as select でいいでしょうか?
Tira

2016/02/21 15:03

実施されたい事、理解しました。 結論から言いますと、ダメそうだと思います。 バックアップテーブルからデータを戻す事を考えます。 実施方法としては一度、元表である、emp、emp2からレコードを削除した後、バックアップテーブルからviewへas selectでインサートするイメージでしょうか。 viewへのレコードインサートは、以下の制約があります。 ・もとの表から列をいくつか選択してビューを定義している場合、ビューを通してデータを挿入すると ビューで使用していない列に対してはNULL値が入ります。 view定義を見ると、以下のデータしかSELECTしていません。 emp ⇒emp_id ⇒emp_name emp2 ⇒emp_id2 ⇒emp_name2 バックアップテーブルにも上記のデータしか保存されない事になり、 emp2.emp_idは保存されない為、バックアップテーブルから戻してもデータ的に元の状態に戻せない事になります。 ここは素直に元テーブルを丸ごとバックアップする事をお勧めします。 また、DB上に別表で取ろうとされてますが、該当テーブルのエクスポート/インポートなどで対応する事にされても良いかと思います。 ご検討下さい。
takotakot

2016/02/22 00:06

質問者の方は、レコード削除ではなく、編集に対して、元に戻したいのではないかと思いました。であれば、SELECT された後のものでも大丈夫そうです。
Tira

2016/02/22 00:32

takotakot様 なるほど。 >3.万が一、元に戻したい場合は1のバックアップテーブルからデータを元に戻す これが、バックアップテーブルからas select で再度UPDATEで戻すイメージですかね? 「Viewへのデータ更新」がレコードの増減が無ければ大丈夫かもね、という感じですね。 レコードの増減ありならば、やっぱりダメじゃないでしょうか?
tshizuku03

2016/02/22 13:10

Tiraさん、takotakotさん お返事ありがとうございました。 takotakotさんのおっしゃる通り、 >レコード削除ではなく、編集に対して、元に戻したい。 です。 「Viewへのデータ更新」は、既存レコードへのUPDATEとなるため、レコードの増減はありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問