【问题标题】:Is it possible to insert data into a MySQL view?是否可以将数据插入 MySQL 视图?
【发布时间】:2010-09-29 21:17:55
【问题描述】:

我用 4 个表创建了一个 MySQL 视图。是否可以在视图中插入数据并让 MySQL 自动将数据传递到正确的表中?

【问题讨论】:

    标签: sql mysql updatable-views


    【解决方案1】:

    如果您使用内部联接,并且您的视图包含基表中的所有列,那么您的视图可能是可更新的。但是,对于多表可更新视图,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 
    

    但我们可以将其拆分为两个操作:

    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)
    

    【讨论】:

    • 还有另一行丢失了
    • 我可以看到你已经删除了上面的那一行,因为上面写着 6 行,而你上面只有 5 行。我也面临同样的问题
    • 该行没有丢失;他添加的两行是连接的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2010-12-23
    • 1970-01-01
    • 2017-08-30
    • 2020-12-09
    相关资源
    最近更新 更多