2012-02-15 304 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子句中定義的條件的表。或者在你的情況下,防止弗雷德搞亂鮑勃的照片。