使用复合键进行多对多自引用

问题描述 投票:0回答:1

我有以下型号

type TenantUser struct {
    TenantID  uint      `json:"tenantId" gorm:"primaryKey; uniqueIndex:idx_name_and_tenant; uniqueIndex:idx_email_and_tenant"`
    UserID    uuid.UUID `json:"-" gorm:"primaryKey; type:uuid"`
    ...
    Visited  []*TenantUser `json:"visited" gorm:"many2many:visitors; foreignKey:TenantID,UserID; references:TenantID,UserID; joinForeignKey:visitor_tenant_id,visitor_user_id; joinReferences:visitee_tenant_id,visitee_user_id"`
    Visitors []*TenantUser `json:"visitors" gorm:"many2many:visitors; foreignKey:TenantID,UserID; references:TenantID,UserID; joinForeignKey:visitee_tenant_id,visitee_user_id; joinReferences:visitor_tenant_id,visitor_user_id"`
}

这会生成以下 sql

create table visitors
(
    visitor_tenant_id bigint not null unique,
    visitor_user_id   uuid   not null,
    visitee_tenant_id bigint not null unique,
    visitee_user_id   uuid   not null,
    primary key (visitor_tenant_id, visitor_user_id, visitee_tenant_id, visitee_user_id),
    constraint fk_visitors_tenant_user foreign key (visitor_tenant_id, visitor_user_id) references tenant_users,
    constraint fk_visitors_visited foreign key (visitee_tenant_id, visitee_user_id) references tenant_users
);

我不明白为什么

visitor_tenant_id
visitee_tenant_id
被定义为唯一的。但更重要的是,我该如何预防?

如果我执行如下代码,并且具有不同的访问者,则仅添加第一个访问者。再做一遍就没有任何作用。它甚至没有给出错误。如果我手动从数据库中删除唯一索引,一切都会按预期进行。

db.Model(&visitee.TenantUser).Association("Visitors").Append([]*model.TenantUser{visitor})

知道发生了什么事吗?

postgresql go-gorm
1个回答
0
投票

uniqueIndex
结构中的
TenantID
字段中删除
TenantUser
标签,然后重新生成数据库架构。

type TenantUser struct {
    TenantID  uint      `json:"tenantId" gorm:"primaryKey"`
    UserID    uuid.UUID `json:"-" gorm:"primaryKey; type:uuid"`
    ...
    Visited  []*TenantUser `json:"visited" gorm:"many2many:visitors; foreignKey:TenantID,UserID; references:TenantID,UserID; joinForeignKey:visitor_tenant_id,visitor_user_id; joinReferences:visitee_tenant_id,visitee_user_id"`
    Visitors []*TenantUser `json:"visitors" gorm:"many2many:visitors; foreignKey:TenantID,UserID; references:TenantID,UserID; joinForeignKey:visitee_tenant_id,visitee_user_id; joinReferences:visitor_tenant_id,visitor_user_id"`
}
© www.soinside.com 2019 - 2024. All rights reserved.