sql >> データベース >  >> RDS >> Mysql

MySQLビューにデータを挿入することは可能ですか?

    内部結合を使用していて、ビューにベーステーブルのすべての列が含まれている場合、ビューは更新可能である可能性があります。ただし、複数テーブルの更新可能なビューの場合、INSERT 単一のテーブルに挿入する場合に機能します。挿入操作を複数のINSERTに分割できます ステートメント。

    このトピックの詳細については、次の記事を確認してください。

    次の例を考えてみましょう:

    CREATE TABLE table_a (id int, value int);
    CREATE TABLE table_b (id int, ta_id int, value int);
    
    INSERT INTO table_a VALUES (1, 10);
    INSERT INTO table_a VALUES (2, 20);
    INSERT INTO table_a VALUES (3, 30);
    
    INSERT INTO table_b VALUES (1, 1, 100);
    INSERT INTO table_b VALUES (2, 1, 200);
    INSERT INTO table_b VALUES (3, 2, 300);
    INSERT INTO table_b VALUES (4, 2, 400);
    

    次に、ビューを作成しましょう:

    CREATE VIEW v AS 
        SELECT      a.id a_id, b.id b_id, b.ta_id, a.value v1, b.value v2
        FROM        table_a a
        INNER JOIN  table_b b ON (b.ta_id = a.id);
    
    SELECT * FROM v;
    +------+------+-------+------+------+
    | a_id | b_id | ta_id | v1   | v2   |
    +------+------+-------+------+------+
    |    1 |    1 |     1 |   10 |  100 |
    |    1 |    2 |     1 |   10 |  200 |
    |    2 |    3 |     2 |   20 |  300 |
    |    2 |    4 |     2 |   20 |  400 |
    +------+------+-------+------+------+
    4 rows in set (0.00 sec)
    

    次のINSERT 失敗:

    INSERT INTO v (a_id, b_id, ta_id, v1, v2) VALUES (3, 5, 3, 30, 500);
    -- ERROR 1393 (HY000): Can not modify more than one base table through a join view 
    

    ただし、これを2つの操作に分割できます。

    INSERT INTO v (a_id, v1) VALUES (3, 30);
    -- Query OK, 1 row affected (0.00 sec)
    INSERT INTO v (b_id, ta_id, v2) VALUES (5, 3, 500);
    -- Query OK, 1 row affected (0.00 sec)
    

    結果:

    SELECT * FROM v;
    +------+------+-------+------+------+
    | a_id | b_id | ta_id | v1   | v2   |
    +------+------+-------+------+------+
    |    1 |    1 |     1 |   10 |  100 |
    |    1 |    2 |     1 |   10 |  200 |
    |    2 |    3 |     2 |   20 |  300 |
    |    2 |    4 |     2 |   20 |  400 |
    |    3 |    5 |     3 |   30 |  500 |
    +------+------+-------+------+------+
    6 rows in set (0.00 sec)
    



    1. MySqlビューは非常に遅いです。なんで?

    2. PDO-MySQL:プリペアドステートメントのバインド時にブール値が1または空の文字列に変換されます

    3. オランダアクセス開発者の日2019–9月14日

    4. NaviCatMySQLクライアントを使用してデータベースに接続する方法