2012-02-15 301 views
2

我想从多个表联接生成的视图中删除一条记录。我有一个新用户在这个特定的视图上删除和插入。我能够将记录插入到视图中,但无法从视图中删除。您能否在下面这段SQL语句中指出错误?MySQL错误:1395无法从联接视图中删除

create view v1 as 
select a.* 
from appearance a, photo p, photographer u, person s 
where a.isShownIn = p.id 
and p.takenBy = u.id 
and u.id = s.id 
and s.name = 'Fred'; 

create user 'Fred'; 

grant insert, delete on assignment_5.v1 to 'Fred'; 


delete from v1 where v1.shows = 17;` 

外观表具有显示和isShownIn列。

回答

1

MySQL的文档状态:

"For a view to be updatable, there must be a one-to-one relationship between the rows in the view and the rows in the underlying table."

MySQL正在执行为设计,并防止你在这里搬起石头砸自己的脚。本质上,从视图中删除的行数与从基础表中删除的行数不匹配。另外,您是否要删除照片,外观,人物或摄影师?或者全部都是?或者只是其中的一部分? MySQL并不确定,所以它不允许操作。

轴承中合心意,运行此查询:

SELECT IS_UPDATABLE 
FROM INFORMATION_SCHEMA.VIEWS 
WHERE TABLE_NAME = 'v1'; 

如果结果比其他任何东西“是”,那么你可能要考虑重新设计你的看法。另一种选择是直接从基础表中删除。

此外,使用“WITH CHECK OPTION”子句创建可更新视图是一个好主意。这样可以防止对基本表的UPDATE或INSERT,除了那些符合视图WHERE子句中定义的条件的表。或者在你的情况下,防止弗雷德搞乱鲍勃的照片。