2016-12-29 9 views
0

複数のテーブルからデータを表示しているビューを作成しました。今私は、ビュー上でデータ操作操作を実行したい。どうすればこれを達成できますか?SQLビューで更新と削除のクエリを実行するには?

これは、彼らがUpdatable and Insertable Views上のMySQLのマニュアルに記載され、一定の基準を満たしていれば私の見解MySQLのビューで

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

Viewは 'あらかじめ定義されたSELECT文'です。ビューを更新または削除することはできません。データ操作操作を実現するには、 'stored procedure'を試してください。 – Viki888

+1

@ E4c5あなたはそれについて確かですか? – Strawberry

答えて

2

は更新することができます。

集計関数(SUM()、MIN()、MAX()、などCOUNT()、および)

•:あなたのビューは、それが次のいずれかが含まれていないため、更新のようですALL

•UNIONまたはUNIONをHAVING•

BY GROUP•

DISTINCT•選択リストのサブクエリ

MySQL 5.7.11より前の選択リストのサブクエリは、INSERTの場合には失敗しましたが、 では、UPDATE、DELETEでは問題ありません。 MySQL 5.7.11以降は、依然として非依存サブクエリに対しては となります。 選択リストの従属サブクエリの場合、データ変更ステートメントは許可されません。特定•

は FROM句内のテーブルを参照するWHERE句にFROM句

•サブクエリで更新不可のビューに

•リファレンス(この項の後半で議論に参加し、追加参照)合流します

•はアルゴリズム= TEMPTABLE(使用•

(この場合、更新する基礎となる テーブルが存在しない)のみリテラル値を参照します一時テーブルは、常にビュー更新できない になります)

ベーステーブルの任意の列に複数の参照•(INSERTのために失敗し、 大丈夫UPDATEため、DELETE)

しかし、それはおそらく挿入可能ではありませんfullnameフィールドは式で計算されます。

あなたのビューが更新可能である場合は、上記のドキュメントに記載された方法を使用して、確認するには、次の

MySQLはフラグを設定し、でVIEW時間をCREATE、ビューの更新可能性フラグと呼ばれます。 UPDATEおよびDELETE(および同様の操作)がビューで合法である場合、フラグはYES(真)に設定されます。それ以外の場合、フラグはNO(偽)に設定されます。 INFORMATION_SCHEMA.VIEWS表のIS_UPDATABLE列に、このフラグの状況が表示されます。

あなたのビューが更新可能である場合、それはあなたの削除または更新ステートメントのテーブルであるかのように、そして、それを使用します。

update contact_view set fname='whatever' 

ビューが更新されていない場合、あなたはあなた自身を記述する必要があります更新および削除ステートメントを使用して変更を実行します。それらをどのように作成するかは、正確な要件に依存します。特に削除操作の場合、関連する子レコードを削除するには、on delete cascade句の外部キーを使用することを検討することをお勧めします。

+0

hm、それはいくつかをクリアします – e4c5

+0

答えを受け入れ、それを受け入れない理由は何ですか? – Shadow

関連する問題