为什么对另一个表有两个列引用的表是不可联接的?

vzgqcmou  于 2022-09-21  发布在  PostgreSQL
关注(0)|答案(1)|浏览(124)

我有两个问题。

1.方案中没有类别对应的joinable!条目,为什么会出现这种情况?
1.如果添加了两列外键引用到同一表,则不允许手动添加两条joinable!语句,例如:

joinable!(categories -> users (created_by));
joinable!(categories -> users (modified_by));

我尝试使用一个指向“USERS”表的外键引用来创建“Categories”表,删除了数据库、删除了方案、运行了迁移,但仍然没有更改方案。

table! {
    categories (id) {
        id -> Int4,
        category_code -> Varchar,
        description -> Varchar,
        gl_cr -> Varchar,
        gl_dr -> Varchar,
        asset_cost_less_than -> Nullable<Int4>,
        over_ride_depreciation_rate -> Bool,
        over_ride_useful_life -> Bool,
        created_by -> Int4,
        created_on -> Timestamp,
        modified_by -> Nullable<Int4>,
        modified_date -> Nullable<Timestamp>,
    }
}

table! {
    users (id) {
        id -> Int4,
        username -> Varchar,
        full_name -> Varchar,
        email -> Varchar,
        active -> Bool,
        created_on -> Timestamp,
    }
}

架构的一部分。Rs是

joinable!(branch_categories -> categories (category_id));
joinable!(branches -> cities (city_id));
joinable!(branches -> users (created_by));
joinable!(category_book_rate_codes -> books (book_id));
joinable!(category_book_rate_codes -> categories (category_id));
joinable!(category_book_rate_codes -> depreciation_rates (rate_id));
joinable!(cities -> states (state_id));
joinable!(cities -> users (created_by));
b4lqfgs4

b4lqfgs41#

如果您的categories表有两列引用了users表:

CREATE TABLE categories (
    id           INTEGER,
    created_by   INTEGER NOT NULL REFERENCES users,
    modified_by  INTEGER          REFERENCES users,
    ...
);

DIESEL不会为categoriesusers生成joinable!条目,因为使用哪一列将是不明确的。您也不能同时手动创建它们,因为它们的实现会发生冲突。该宏旨在使这种查询在没有显式ON子句的情况下成为可能:

categories::table.join(users::table)...

我不确定为什么删除一个外部引用并重新生成模式对您没有影响,但无论如何……当然,您可以手动实现其中的一个,如下所示:

joinable!(categories -> users (created_by));

然后,当您希望根据categories的创建者将categories连接到users时,可以使用上面的查询语法。如果以后还想根据它们的最后一个修饰符连接它们,可以在您的查询中显式地(未测试)这样做:

categories::table.join(users::table.on(categories::modified_by.eq(users::id.nullable())))...

相关问题