天天看點

視圖之二--視圖中資料的更新

  視圖不是表,視圖裡面的資料是通過sql語句去表中查詢得到的。當表中的資料發送更改之後,視圖裡的資料也會發生相應的更改。是以我麼一般有兩種方式更新視圖裡面的資料:一是更新表中的資料,進而間接地更新視圖中的資料;二是直接寫sql已經更新視圖。第一種是方式是一定可以的,第二中方法,能否可行取決于視圖的具體結構。以下對第二種方法進行分析。

表結構如下:

一、視圖隻包含一張表的字段

  1、包含全部字段

    視圖定義如下: 

  該視圖是查詢student表中的所有記錄,進行更新的語句如下。

  UPDATE,INSERT,DELETE,都是可以的。INSERT的時候,如果之增加部分字段的值,如果未增加的字段沒有預設值,且不能為空,則報錯。

  2、帶有id的部分字段

    視圖定義如下:

  該視圖查詢student表中的id,name,age字段的記錄,進行更新的語句如下:

  由于student表中password字段預設值為null,是以INSERT的時候password沒有指派,也是可以增加的,UPDATE和DELETE也是成功的。

  3、不帶有id的部分字段

  該視圖查詢student表中的name,age字段的記錄,進行更新的語句如下:

  INSERT的時候id沒有預設值,是以失敗。UPDATE和DELETE都成功。

二、視圖包含兩張表

  1、使用了group by分組查詢

    查詢所有人各科成績

    要執行的更新語句如下:

   第一行INSERT,增加name,以及各科成績。因為視圖中的記錄使用到了分組語句進行查詢,索引無法進行增加,UPDATE和DELETE也一樣會報錯。

  2、沒有使用group by等分組查詢

    視圖的定義如下:

  查詢student表的id,stu_no,name,course表的name,score。

   要進行的更新語句如下:

  對于多表可更新視圖,如果是将其插入單個表中,INSERT能夠工作。UPDATE也是可以的但不支援DELETE。

三、總結

  對于直接用sql語句去更新視圖的的時候,有些時候是可以成功,有些時候不會。這 取決于視圖的結構。

  視圖内容是單表的時候,UPDATE,DELETE可以執行成功,對于INSERT如果未設值的字段都有預設值,或者是可以為空的字段的時候可以執行成功,否則會執行失敗。對

  視圖内容是兩張或兩張表以上的時候,如果使用了分組查詢語句的時候,INSERT,updat,DELETE都會執行失敗。如果沒有使用分組查詢語句的時候UPDATE是可以執行成功,DELETE會失敗。INSERT隻能将結構插入當個表中,所有插入的字段隻能都在一張表中,而且未設定的字段都有預設值,或者是可以為空的字段的時候才可以執行成功,否則會執行失敗。