プロが教えるわが家の防犯対策術!

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

A 回答 (2件)

結合したりグループ化した情報を表示したりする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 していなければ更新してくれそうですけど。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/04/12 19:32

MySQLあまり詳しくないのですが。


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

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

お礼日時:2007/04/12 19:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!