2016-12-29 65 views
0

我創建了一個顯示多個表中數據的視圖。現在我想對視圖執行數據操作操作。我怎樣才能做到這一點?如何在sql視圖上執行更新和刪除查詢?

這是我的視圖

CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `forge`@`%` 
    SQL SECURITY DEFINER 
VIEW `contact_view` AS 
    SELECT 
     `c`.`id` AS `id`, 
     `c`.`fname` AS `fname`, 
     `c`.`mname` AS `mname`, 
     `c`.`lname` AS `lname`, 
     CONCAT(`c`.`fname`, ' ', `c`.`lname`) AS `fullname`, 
     `c`.`gender` AS `gender`, 
     `c`.`dob` AS `dob`, 
     `c`.`points` AS `points`, 
     `c`.`stars` AS `star`, 
     `c`.`inst_id` AS `inst_id`, 
     `c`.`ingr_id` AS `ingr_id`, 
     `c`.`fami_id` AS `fami_id`, 
     `c`.`sour_id` AS `sour_id`, 
     `c`.`image` AS `img`, 
     `c`.`address` AS `address`, 
     `c`.`email` AS `email`, 
     `c`.`doc` AS `doc`, 
     `cl`.`value` AS `mobile`, 
     `p`.`district` AS `district`, 
     `p`.`pincode` AS `pincode` 
    FROM 
     (((`contact` `c` 
     JOIN `communication_link` `cl`) 
     JOIN `contact_communication` `cc`) 
     JOIN `pincode_db` `p`) 
    WHERE 
     ((`cl`.`cont_id` = `c`.`id`) 
      AND (`cl`.`coco_id` = 1) 
      AND (`c`.`pinc_id` = `p`.`id`)) 
+0

有沒有其他辦法可以達到這個目的? – SaMeEr

+0

查看只是一個'預定義的SELECT語句'。您不能在視圖中進行任何更新或刪除。如果你想實現數據操作操作,那麼試試'存儲過程'。 – Viki888

+1

@ E4c5你確定嗎? – Strawberry

回答

2

在MySQL視圖可以是可更新的,如果符合上Updatable and Insertable Views MySQL文檔中描述的某些標準。你的觀點似乎是可更新的,因爲它不包含任何的以下內容:

聚合函數(SUM(),MIN(),MAX(),COUNT(),等等)

• DISTINCT

•GROUP BY

•HAVING

•UNION或UNION ALL

•在選擇列表中的子查詢

在MySQL 5.7.11之前,select列表中的子查詢失敗,INSERT, 但可以更新UPDATE,DELETE。從MySQL 5.7.11開始,非依賴子查詢仍爲 。對於 選擇列表中的從屬子查詢,不允許使用數據更改語句。

•某些連接(見附加在本節後面加入討論)

•參考不可更新視圖在WHERE子句在FROM子句中

•子查詢是指在將表從 條款

•僅指文本值(在這種情況下,不存在下層 表更新)

•ALGORITHM =不是Temptable(使用的臨時表總是讓 不可更新的視圖)

•基表的任何列多個引用(失敗的INSERT, 好了UPDATE,DELETE)

但是,它可能不是插入的,因爲fullname字段是通過表達式計算的。

要確認,如果您的視圖是可更新的,用上面的文檔中描述的方法:

的MySQL設置一個標誌,稱爲視圖可更新標誌,在CREATE VIEW時間。如果UPDATE和DELETE(以及類似的操作)對視圖合法,則標誌設置爲YES(真)。否則,該標誌被設置爲NO(假)。 INFORMATION_SCHEMA.VIEWS表中的IS_UPDATABLE列顯示此標誌的狀態。

如果您的視圖是可更新的,那麼就使用它,如果它是在你刪除或更新語句表:

update contact_view set fname='whatever' 

如果你的觀點是不更新,那麼你需要編寫自己的更新和刪除語句來執行修改。您如何創建它們將取決於您的確切要求。特別是對於刪除操作,您可能需要考慮使用on delete cascade子句的外鍵來刪除相關的子記錄。

+0

hm,即清除了一些東西 – e4c5

+0

接受答案然後取消接受答案的任何理由? – Shadow

相關問題