mysqlビューの更新可能なビューの作成方法の詳細

5194 ワード

この例では、mysqlビューの更新可能なビューを作成する方法について説明します.皆さんの参考にしてください.具体的には以下の通りです.
mysqlでは、ビューはクエリー可能であるだけでなく、更新可能であることがわかります.これは、insert文またはupdate文を使用して、更新可能ビューを使用してベーステーブルのローを挿入または更新できることを意味します.また、delete文を使用して、下位テーブルのローをビューから削除することもできます.ただし、更新可能ビューを作成するには、ビューを定義するselect文に次の要素を含めることはできません.
  • 集約関数、例えば、min、max、sum、avg、countなど.
  • DISTINCT句
  • GROUP BY句
  • HAVING句
  • 左接続または外部接続.
  • ユニオンまたはユニオンALL句
  • SELECT句のサブクエリまたはテーブルを参照するwhere句のサブクエリがFROM句に表示されます.
  • FROM句の更新不可ビュー
  • を参照する.
  • 文字値
  • のみ参照
  • ベース・テーブルの任意のカラムへの複数回の参照
  • temptableアルゴリズムを使用してビューを作成すると、ビューを更新できませんが、内部接続を使用して複数のテーブルに基づく更新可能なビューを作成できる場合があります.余計なことは言わないで、まず更新可能なビューを作成する方法を見てみましょう.まず、officesテーブルに基づいてofficeInfoというビューを作成してみましょう.officesテーブルの3つの列:officeCode、phone、cityを指します.
    
    CREATE VIEW officeInfo
     AS
      SELECT officeCode, phone, city
      FROM offices;
    
    

    次に、officeInfoビューから次の文を使用してデータを問合せます.
    
    SELECT
      *
    FROM
      officeInfo;
    
    

    上記のクエリ文を実行すると、次の結果が得られます.
    
    mysql> SELECT * FROM officeInfo;
    +------------+------------------+---------------+
    | officeCode | phone      | city     |
    +------------+------------------+---------------+
    | 1     | +1 650 219 4782 | San Francisco |
    | 2     | +1 215 837 0825 | Boston    |
    | 3     | +1 212 555 3000 | NYC      |
    | 4     | +33 14 723 4404 | Paris     |
    | 5     | +86 33 224 5000 | Beijing    |
    | 6     | +61 2 9264 2451 | Sydney    |
    | 7     | +44 20 7877 2041 | London    |
    +------------+------------------+---------------+
    7 rows in set
    
    

    次に、officeInfoビューを使用して、次のupdate文を使用してofficeCodeの値を4のオフィス電話番号に変更します.
    
    UPDATE officeInfo
    SET
      phone = '+86 089866668888'
    WHERE
      officeCode = 4;
    
    

    最後に、変更結果を検証し、次のクエリを実行してofficeInfoビューのデータを問合せます.
    
    mysql> SELECT
      *
    FROM
      officeInfo
    WHERE
      officeCode = 4;
    
    
    
    +------------+------------------+-------+
    | officeCode | phone      | city |
    +------------+------------------+-------+
    | 4     | +86 089866668888 | Paris |
    +------------+------------------+-------+
    1 row in set
    
    

    終わったらinformationからschemaデータベースのviewsテーブルクエリis_updatable列を使用して、データベース内のビューが更新可能かどうかを確認します.たとえば、luyaranデータベースをクエリーしてすべてのビューを取得し、更新可能なビューを表示します.
    
    SELECT
      table_name, is_updatable
    FROM
      information_schema.views
    WHERE
      table_schema = 'luyaran';
    
    

    上記のクエリ文を実行すると、次の結果が得られます.
    
    +------------------+--------------+
    | table_name    | is_updatable |
    +------------------+--------------+
    | aboveavgproducts | YES     |
    | bigsalesorder  | YES     |
    | customerorders  | NO      |
    | officeinfo    | YES     |
    | saleperorder   | NO      |
    +------------------+--------------+
    5 rows in set
    
    

    次に、ビューからローを削除してみます.まず、itemsというテーブルを作成し、itemsテーブルにローを挿入し、700以上の価格のアイテムを含むクエリーのビューを作成します.
    
    USE testdb;
    -- create a new table named items
    CREATE TABLE items (
      id INT AUTO_INCREMENT PRIMARY KEY,
      name VARCHAR(100) NOT NULL,
      price DECIMAL(11 , 2 ) NOT NULL
    );
    -- insert data into the items table
    INSERT INTO items(name,price)
    VALUES('Laptop',700.56),('Desktop',699.99),('iPad',700.50) ;
    -- create a view based on items table
    CREATE VIEW LuxuryItems AS
      SELECT
        *
      FROM
        items
      WHERE
        price > 700;
    -- query data from the LuxuryItems view
    SELECT
      *
    FROM
      LuxuryItems;
    
    

    上記のクエリ文を実行すると、次の結果が得られます.
    
    +----+--------+--------+
    | id | name  | price |
    +----+--------+--------+
    | 1 | Laptop | 700.56 |
    | 3 | iPad  | 700.5 |
    +----+--------+--------+
    2 rows in set
    
    

    完了するにはDELETE文を使用してidが3の行を削除します.
    
    DELETE FROM LuxuryItems
    WHERE
      id = 3;
    
    

    mysqlは、1行が影響を受けていることを示すメッセージを返します.
    Query OK, 1 row affected
    ビューでデータを再度確認します.
    
    mysql> SELECT * FROM LuxuryItems;
    +----+--------+--------+
    | id | name  | price |
    +----+--------+--------+
    | 1 | Laptop | 700.56 |
    +----+--------+--------+
    1 row in set
    
    

    また、ベース・テーブルitemsからデータをクエリーして、DELETE文が実際にローを削除したかどうかを確認することもできます.
    
    mysql> SELECT * FROM items;
    +----+---------+--------+
    | id | name  | price |
    +----+---------+--------+
    | 1 | Laptop | 700.56 |
    | 2 | Desktop | 699.99 |
    +----+---------+--------+
    2 rows in set
    
    

    ID 3の行がベーステーブルから削除されていることがわかります.
    はい、今回の記録はここまでです.
    MySQLに関する詳細について興味のある読者は、「MySQLクエリーテクニック大全」、「MySQLトランザクションテクニック要約」、「MySQLストレージプロセステクニック大全」、「MySQLデータベースロックに関するテクニック要約」および「MySQL常用関数大概要約」を参照してください.
    本明細書では、MySQLデータベース・メーターについて説明します.