みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

皆さん、はじめまして。
今回業務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文実行時にエラーが帰ってきてしまいます。
原因がわかるかたがいらっしゃいましたらご教授のほうよろしくお願いします。

投稿日時 - 2007-04-12 10:47:54

QNo.2914744

困ってます

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

結合したりグループ化した情報を表示したりするViewの場合、
表示されるデータだけは、DBMSがデータが特定できない可能性があるため、読み取り専用になります。
あなたの提示した例のような単純な結合であればDBMSががんばれば、実は解決できるのですが、いちいちどのView定義(結合したりグループ化した)が更新可能かを解析していてはコストがかかるので、単純に禁止しているのだと思います。

逆に結合したりグループ化していないViewは更新させてくれるDBMSもあったはずです。
例:create view test as select testname1 from cwork1;
この場合、testname1の列を一部非表示にしているだけですので、
DBMSはレコードを更新出来る。
delete from test where testname1 = '山田';

mysqlが出来るかどうかは、当方テスト環境が無いためわかりませんが、
あなたのdelete文に対するエラー文に、
join viewと明示されているので、join していなければ更新してくれそうですけど。

投稿日時 - 2007-04-12 12:53:48

お礼

早期回答ありがとうございます。
もう少しためしてみることにします。

投稿日時 - 2007-04-12 19:32:26

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

MySQLあまり詳しくないのですが。
VIEWと言うものはもともと複数テーブルの参照をかんたんに行う為のテーブルです。
複数のテーブルから特定カラムを持ってきているのでその他のレコードからも参照される可能性があります。
今回は1対1のレコードですが1対多などの場合にdeleteが出来ると
ほかからの参照が出来なくなりますよね。
そのためVIEWの更新は出来ないのではないでしょうか。

投稿日時 - 2007-04-12 10:58:09

お礼

早期回答ありがとうございます。
確かにそういわれますとそのような気がします。
削除に関してですが 制約で消えてくれるかなとおもっておりました。
もう少し試してみることにします。

投稿日時 - 2007-04-12 19:38:52

あなたにオススメの質問