我正在尝试从多个表的连接生成的视图中删除记录。我有一个新用户要删除并插入此特定视图。我能够将记录插入视图但不能从视图中删除。你能否在下面的SQL语句中指出一个错误?
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;`
外观表有show和isShownIn列。
答案 0 :(得分:1)
MySQL文档声明:
“对于可更新的视图,必须存在一对一的关系 在视图中的行和基础表中的行之间。“
MySQL正在按设计执行,并且阻止您在这里拍摄自己。实质上,从视图中删除的行数与从基础表中删除的行数不匹配。此外,你想删除照片,外观,人物或摄影师吗?还是所有人?或者只是其中一些? MySQL也不确定,所以它不允许操作。
请注意,运行此查询:
SELECT IS_UPDATABLE
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME = 'v1';
如果结果不是“是”,那么您可能需要考虑重新设计视图。另一种选择是直接从基础表中删除。
使用“WITH CHECK OPTION”子句创建可更新视图也是一个好主意。这可以防止对基础表的UPDATE或INSERT,除了那些满足视图的WHERE子句中定义的条件的表。或者在你的情况下,防止弗雷德弄乱鲍勃的照片。