替换现有的View,但MySQL说“表不存在”

时间:2014-11-02 17:12:48

标签: mysql views

我的MySQL数据库中有一个表compatibility_core_rules,它基本上存储了一对id,它们表示具有相应id的字段的部分之间的兼容性。现在,我的目标是通过遵循对的传递性来获得所有可能的兼容性对(例如,如果表具有(1,2)和(2,4),则添加对(1,4))。所以,从数学上讲,我试图找到compatibility_core_rules表的传递闭包。

E.g。如果compatibility_core_rules包含(1,2),(2,4)和(4,9),那么最初我们可以看到(1,2)和(2,4)给出一对新的(1,4) )。然后我迭代更新的对,发现(4,9)新添加的(1,4)给了我(1,9)。此时,再次迭代将不再添加对。

所以我的方法是创建一个包含来自compatibility_core_rules的初始对的视图,如下所示:

CREATE VIEW compatibility_core_rules_closure 
    AS
        SELECT  part_type_field_values_id_a, 
                part_type_field_values_id_b, 
                custom_builder_id
        FROM    compatibility_core_rules;

然后,为了迭代发现所有对,我需要继续用自己的更新版本替换该视图,每次都有额外的对。但是,我发现MySQL并不像我在自己的定义中引用视图那样,所以我做了一个临时视图(带或替换,因为这将在循环内):

CREATE OR REPLACE VIEW compatibility_core_rules_closure_temp 
    AS
        SELECT  part_type_field_values_id_a, 
                part_type_field_values_id_b, 
                custom_builder_id
        FROM    compatibility_core_rules_closure;

这里没问题。然后,我在以下CREATE OR REPLACE VIEW语句中引用此临时视图,以使用一次迭代的额外对更新compatibility_core_rules_closure视图:

CREATE OR REPLACE VIEW compatibility_core_rules_closure 
    AS
        SELECT 
                    CASE WHEN ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_a THEN ccr1.part_type_field_values_id_b
                         WHEN ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_b THEN ccr1.part_type_field_values_id_b
                    END ccrA,
                    CASE WHEN ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_a THEN ccr2.part_type_field_values_id_b
                         WHEN ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_b THEN ccr2.part_type_field_values_id_a
                    END ccrB,
                    ccr1.custom_builder_id custom_builder_id
        FROM        compatibility_core_rules_closure_temp ccr1
        INNER JOIN  compatibility_core_rules_closure_temp ccr2 
            ON      (
                        ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_a     OR
                        ccr1.part_type_field_values_id_a = ccr2.part_type_field_values_id_b
                    )
        GROUP BY    ccrA, 
                    ccrB
        HAVING      -- ccrA and ccrB are in fact not the same
                    ccrA != ccrB
                    -- ccrA and ccrB do not belong to the same part type
                    AND (
                            SELECT      ptf.part_type_id 
                            FROM        part_type_field_values ptfv 
                            INNER JOIN  part_type_fields ptf 
                                ON      ptfv.part_type_field_id = ptf.id 
                            WHERE       ptfv.id = ccrA 
                            LIMIT       1
                        ) !=
                        (
                            SELECT      ptf.part_type_id 
                            FROM        part_type_field_values ptfv 
                            INNER JOIN  part_type_fields ptf 
                                ON      ptfv.part_type_field_id = ptf.id 
                            WHERE       ptfv.id = ccrB 
                            LIMIT       1
                        )

现在这是出问题的地方。我收到以下错误:

#1146 - Table 'db509574872.compatibility_core_rules_closure' doesn't exist 

我对此错误消息感到非常困惑。我字面上刚刚创建了两个语句之前的视图/表。我确定SELECT查询本身是正确的,因为如果我自己尝试它并且运行正常。如果我将第一行更改为使用compatibility_core_rules_closure2而不是compatibility_core_rules_closure,那么它运行正常(但是,由于我需要一次又一次地重新更新同一视图,因此没有多大用处) 。我查看了SQL SECURITY条款,但没有取得任何成功。也在网上进行研究,但没有到达任何地方。

有没有人知道发生了什么以及如何解决它?

1 个答案:

答案 0 :(得分:0)

MySQL不支持视图中的子查询。

你必须将它们分开......即。使用包含您主视图中的子查询的另一个视图。

为该视图运行create语句将呈现错误,而不是创建它,因此在查询时不会出现错误。