• ベストアンサー

Viewに対して更新したときもとのTableの値はどうなる?

SQLの初歩的な質問す。 create view testview as select a,b from testtable ; というようにtestviewを作成して、 insert into testview ( a,b )values( 'aaa','bbb' ) というようにtestview にデータを作成したとき、 testtableの値も更新されるのですか? よろしくお願いします。 以上

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

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

  • ベストアンサー
回答No.1

viewというのは実体を持たないのです。 では実体を持たないものに更新を掛けるという事は? 実体であるテーブルに更新を行っているのです。 なのでレコードが特定できないview(gropu句などがあるようなもの)には更新できません。

tanida
質問者

お礼

回答ありがとうございます。 よく理解できました。 以上

関連するQ&A

  • マテリアライズド・ビューの再計算について

    こんにちは ORACLE のマテビューについて困っています。 マテビューを作成して元となるテーブルを削除し再び作成してデーターを投入した後 マテビューを参照するとテーブルを削除する前の情報が表示されてリフレッシュされません どのようにしたら再作成後に投入したデーターをマテビューで表示させる事ができますでしょうか 【検証】 ◆テーブルの作成 CREATE TABLE TEST_TBL (A CHAR(2), B CHAR(5)); ◆レコードを追加 INSERT INTO TEST_TBL VALUES('01','AAA'); INSERT INTO TEST_TBL VALUES('02','BBB'); INSERT INTO TEST_TBL VALUES('03','CCC'); COMMIT; ◆マテビューの作成 CREATE MATERIALIZED VIEW MV_TEST_TBL REFRESH COMPLETE ON COMMIT AS SELECT * FROM TEST_TBL; ◆マテビューの確認 #1 SELECT * FROM MV_TEST_TBL; 3件表示される (正常) ◆レコードの追加 INSERT INTO TEST_TBL VALUES('04','DDD'); COMMIT; ◆マテビューの確認 #2 SELECT * FROM MV_TEST_TBL; 4件表示される (正常) ◆テーブルの削除 DROP TABLE TEST_TBL CASCADE CONSTRAINTS; ◆テーブルの作成 CREATE TABLE TEST_TBL (A CHAR(2), B CHAR(5)); ◆マテビューの確認 #3 SELECT * FROM MV_TEST_TBL; 4件表示される (期待としては 0件であったが) ※疑問1 テーブルのDROP & CREATE は再計算のトリガーに           ならないのか? ◆レコードの追加 INSERT INTO TEST_TBL VALUES('05','DDD'); COMMIT; ◆マテビューの確認 #4 SELECT * FROM MV_TEST_TBL; 4件表示される  ※期待としては1件だけが表示されてほしかったが 使い方としてはマテビューではなくても普通のビューでもいいのでは と思われるかもしれませんが、元となるテーブルのDROP & CREATE が システム的に発生しますがその際にビューの再作成をしたくないので マテビューを選択しました。

  • ビューに追加・削除が出来ません。

    皆さん、はじめまして。 今回業務mysqlでデータベースを作成することになりました。 ビューを用いて二つのテーブルに値の追加・削除・更新をしようと試みたのですが、追加、削除が上手くできませんでした。 mysqlのバージョンは5.0.37です。 今回以下のコマンドを実行しました。 1.<cwork1テーブル作成> create table cwork1 (testname1 varchar(255), testname2 varchar(255), primary key(testname1))TYPE=INNODB; primary key(id)); 2.<cwork2テーブル作成> create table cwork2 (r_name1 varchar(255), yakusyoku varchar(255), foreign key(r_name1) references cwork1(testname1) ON DELETE CASCADE ON UPDATE CASCADE )TYPE=INNODB; 3.<cwork1テーブルに追加> insert into cwork1(testname1,testname2) values('山田','太郎'); 4.<cwork2テーブルに追加> insert into cwork2(r_name1,yakusyoku) values('山田','一般'); 5.<ビュー作成> CREATE VIEW testview AS SELECT * FROM cwork1,cwork2 where cwork1.testname1=cwork2.r_name1; この5つを実行後、 <insert実行> insert into testview(testname1,testname2,yakusyoku) values('斉藤','花子','一般'); ERROR 1395 (HY000):Can not modify more than one base table through a join view 'sampledb.testview' <delete実行> delete from testview where testname1='山田'; ERROR 1395 (HY000): Can not delete from join view 'sampledb.testview' というようにinsert、delete文実行時にエラーが帰ってきてしまいます。 原因がわかるかたがいらっしゃいましたらご教授のほうよろしくお願いします。

    • ベストアンサー
    • MySQL
  • A5:SQL Mk-2でテーブルは作れないのか?

    xamppとA5:SQL Mk-2ソフトを組み合わせてます。 phpmyadminでデータベースとテーブルを作ってMk-2でsql文 例としてselecto * from aaa;などは動きます。 しかしMk-2で CREATE TABLE shiire(scode CHAR(4),kosuu INT,sdate CHAR(7)); INSERT INTO shiire VALUES ('A002',35,'2003-04'); INSERT INTO shiire VALUES ('B002',24,'2003-05'); は作れません。phpmyadminのクエリでは作れます。 ご教授ください。

    • ベストアンサー
    • MySQL
  • [materialized]マテリアライズドビューの検索

    マテリアライズドビューを作成し、selelct文を発行致しましたら、 『"TEST2":無効な識別子です。』とエラーが出てしまいました。 下記の様に、テーブル、View、マテリアライズドビューを作成した後、 select文を作成しました。 View、マテリアライズドビュー、select文のいずれかで間違いが有ると思うのですが、どの様に修正を行えば良いのかが分かりません。 ですのでエラーを回避する方法を教えて頂きたく思っております。 宜しくお願い致します。 ■テーブル1作成 Create table TEST_TBL1 ( Test1 nchar(6), Test2 nchar(6) ); ■テーブル2作成 Create table TEST_TBL2 ( Test1 nchar(6), Test2 nchar(6) ); ■レコード追加 INSERT INTO TEST_TBL1 (Test1, Test2) VALUES (1,1); INSERT INTO TEST_TBL1 (Test1, Test2) VALUES (2,2); INSERT INTO TEST_TBL2 (Test1, Test2) VALUES (3,3); INSERT INTO TEST_TBL2 (Test1, Test2) VALUES (4,4); ■ビュー作成 create view TEST_VIEW as select A.rowid AROWID,A.Test1 ID,A.Test2 TITLE,3 MARKER from TEST_TBL1 A union all select B.rowid AROWID,B.Test1 ID,B.Test2 TITLE,4 MARKER from TEST_TBL2 B; ■ログ作成 create materialized view log on TEST_TBL1 with sequence,rowid (Test1, Test2) including new values; create materialized view log on TEST_TBL2 with sequence,rowid (Test1, Test2) including new values; ■マテビュー作成 create materialized view TEST_MVIEW REFRESH FAST on demand as select * from TEST_VIEW; ■データ抽出 Select TEST1 FROM TEST_MVIEW WHERE TEST2 = '1'; ご回答の程、宜しくお願い致します。

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

  • viewの性能

    あるテーブルがあって、Viewがそのままテーブルを参照してます。 そのViewをそのまま参照しているViewが階層的にあるとします。 テーブルA ← View1 ← View2 ← View3 [SQL的イメージは] ・creat table テーブルA (・・・) ・create view1 as select * from テーブルA ・create view2 as select * from view1 ・create view3 as select * from view2 質問したい事として、 View1 を参照するのとView3を参照するのは、View1を参照するのが 階層化が無い分、速いのでしょうか? それともそのまま参照している場合、あまり速さは変わらないのでしょうか?

  • PHP/MySQL INSERT文について。

    PHP/MySQL INSERT文について。 こんばんは。 PHP・MySQLでデータベースへデータの書き込みを試行錯誤しております。 そこで一つどうしても解決出来ない問題(謎)があるので質問させて頂きます。 簡易的な質問内容としては 全てのカラムに対する値の挿入は可能なのに カラムを指定して値を挿入しようとしたらエラーが出ます。 データベースの設定はテーブル名【TESTtable】 フィールド 種別 NULL 属性/その他 AAA int(6) No UNSIGNED ZEROFILL / auto_increment BBB int(4) Yes CCC int(4) Yes DDD int(4) Yes PHPでのSQL実行文をしてはの記述としては(値は全て可変で数値を代入します。) INSERT INTO TESTtable VALUES (last_insert_id(),50,600,50) とした場合は問題無くテーブルに書き込みされますが カラムを指定して INSERT INTO TESTtable (AAA,BBB,CCC,DDD) VALUES (last_insert_id(),50,600,50) とした場合、書き込みが行われません。 INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable (AAA,'BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),'50','600','50') 等、色々試してみましたが不可能でした。 カラムAAAはauto_incrementにりますので毎回書き込みされますが BBB、CCC、DDDは書き込みが不要の場合もあるので カラム指定の書き込みは必須となるのですが・・・行き詰ってしまいました・・・。 ご教授頂ければ幸いです。 どうぞ、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • 別テーブルからselectした値を他のテーブルにinsertしたいのですが、上手くできません

    以下のように行ったのですが、 全ての値が別テーブルにinsertされません。 $sql = "SELECT tbl_A.id, tbl_A.data FROM tbl_A "; $rst = mysql_query( $sql ); while ( $col = mysql_fetch_array( $rst ) ) { $sql = "INSERT INTO tbl_B (          date, id, data ) VALUES ( '" . date( 'Y-m-d' ) . "', '" . mysql_real_escape_string( $col['id'] ) . "', '" . mysql_real_escape_string( $col['data'] ) . "' )"; } このやり方では、テーブル内の1つの値しかinsertされません。 selectされた全ての値をinsertするにはどのようにしたら良いのでしょうか? よろしくお願いします。 DB:mysql5 SP:php5

    • ベストアンサー
    • MySQL
  • MySQLから取り出したものを3つに分ける

    MySQLに以下のようなSQLを打ちました。 create table table_list( id int, task varchar(255) ); insert into table_list values(1,'ほげほげ1-1'); insert into table_list values(1,'ほげほげ1-2'); insert into table_list values(2,'ほげほげ2-1); insert into table_list values(2,'ほげほげ2-2'); insert into table_list values(3,'ほげほげ3-1'); そして、空のdiv要素が3つあります。 このデータベースからidの数値別に、div要素へtaskの文字列を入れたいのですが、どうすればいいのでしょうか? SQLで「select * from table_list」をやってからtaskを取り出すのか、3回SQLで「select task from table_list where id=1」のようにするのがよろしいんでしょうか?

    • ベストアンサー
    • PHP
  • フィールドをデフォルト0にする

    フィールドをデフォルト0にする方法が知りたいです。 以下のようなサンプルがります。 drop table test_a; create table test_a ( name varchar2(10), a number(1), b number(1), c number(1) ) insert into test_a (name) values ('AAA'); insert into test_a (name,a) values ('BBB', NULL); insert into test_a (name,a,b) values ('CCC', NULL,NULL); select * from test_a; この状態では、a,b,cはNULLですが、a,b,cの値をデフォルト値で0にしたい為、 update test_a set a = 0, b = 0, c = 0; として、データを直して、次回から insert into test_a (name) values ('DDD'); とすると、nameがDDDの時もa,b,cが0となるようにテーブル定義を変えたいのですが 既存のテーブルをそのままで、途中から変更する方法が知りたいです。