首页 > 解决方案 > 无法在 postgresql 中将列的类型从 uuid 更改为 INT

问题描述

我在railscalibration_sessions中有表:

t.uuid "calibration_cycle_id", null: false
t.datetime "created_at", null: false
t.integer "creator_id", null: false
t.datetime "deleted_at"
t.string "name", null: false
t.jsonb "state_transition_progress", default: []
t.string "status", null: false
t.datetime "updated_at", null: false
t.integer "updater_id", null: false
t.uuid "uuid", default: -> { "uuid_generate_v4()" }, null: false
t.index ["calibration_cycle_id", "status", "deleted_at"], name: "index_calibration_sessions_on_cycle_and_status_and_deleted_at", using: :btree
t.index ["creator_id"], name: "index_calibrations_sessions_on_creator_id", using: :btree

以上是表的架构。

我正在尝试将列calibration_cycle_id 的类型更改为INT。

TRUNCATE TABLE calibrations_sessions;
ALTER TABLE calibrations_sessions ALTER COLUMN calibration_cycle_id TYPE INT USING calibration_cycle_id::integer;

我怎么会收到以下错误:

ERROR:  cannot cast type uuid to integer
LINE 1: ...ation_cycle_id TYPE INT USING calibration_cycle_id::integer;

我在这里做错了什么?

标签: ruby-on-railspostgresql

解决方案


UUID 是 32 位的类型,无法自动转换为太小的 int 数据类型。

您需要编写自己的转换函数。参见例如从 PostgreSQL 中的 uuid 的大端创建大整数


推荐阅读