在相关的 PostgreSQL 表中同时使用整数和 UUID 主键
Using both integer and UUID primary keys in related PostgreSQL tables
我正在使用 Keystone.js 来管理 PostgreSQL 数据库。我的数据库有两个单独的 tables(Customer
和 Order
),它们具有定义的关系,如 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 与 Customer
和 Order
的默认整数 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
,,, ;
我正在使用 Keystone.js 来管理 PostgreSQL 数据库。我的数据库有两个单独的 tables(Customer
和 Order
),它们具有定义的关系,如 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 与 Customer
和 Order
的默认整数 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
,,, ;