在相关的 PostgreSQL 表中同时使用整数和 UUID 主键

Using both integer and UUID primary keys in related PostgreSQL tables

我正在使用 Keystone.js 来管理 PostgreSQL 数据库。我的数据库有两个单独的 tables(CustomerOrder),它们具有定义的关系,如 here:

所述

客户:

fields: {
  ordersPlaced: {
    type: Relationship, ref: 'Order.customer', many: true
  }
  // And some other fields
},

订单:

fields: {
  customer: {
    type: Relationship, ref: 'Customer.ordersPlaced', many: false
  }
  // And some other fields
},

如果两个 table 都使用自动递增整数 UUID 作为它们的主键,一切都会按预期工作。

但是,如果我对一个 table 使用整数 ID,对另一个使用 UUID(这是我的首选方法),我会在 Keystone 管理中收到以下错误 UI:

select "t0".* from "public"."Order" as "t0" left outer join "public"."Order" as "t1" on "t0"."ordersPlaced" = "t1"."id" where true and "t0"."ordersPlaced" =  - operator does not exist: uuid = integer

这是我设置的限制吗,即相关的 table 必须使用相同的 type 作为它们的主键吗?或者是否可以将 UUIDs 与 CustomerOrder 的默认整数 ID 一起使用?

无论哪种情况,我都不确定是 Keystone.js、PostgreSQL 还是 knex.js 是错误的来源,这使得调试变得困难。

加入的 table 的主键不相同,因为您通常不会将主键联接到主键。您将子项 table 中的一个属性列(通常定义为外键)连接到父项的 PK。 这些列必须属于同一类型。您正在寻找类似这样的定义:

create table customers( id integer generated always as identity
                      , ...
                      , constraint customers_pk
                                   primary key (id)
                      ); 
Create table orders ( id uuid default generate_random_uuid
                    , cust_id integer not null
                    , ...
                    , constraint orders_pk 
                                 primary key (id)
                    , constraint orders2cust_fk
                                 foreign key (cust_id)
                                 references customers(id)
                    ); 

then to join
select ...
  from customers  c 
  join orders o on o.cust_id - c.id 
  ,,, ;