【问题标题】:Why is the column not altering when I try to convert it to UUID?为什么当我尝试将其转换为 UUID 时该列没有改变?
【发布时间】:2021-11-27 23:23:11
【问题描述】:

我在 PostgreSQL 的 SQL 表中有一个名为“id”的主键列。这是一个“大系列”专栏。我想将该列转换为“UUID”列。它在终端中输入以下命令:

alter table people alter column id uuid;

alter table people alter column id uuid using (uuid_generate_v4());

但他们都没有工作。

在两次尝试中我都收到了错误消息

错误:“uuid”处或附近的语法错误

第 1 行:alter table people 更改列 id uuid using (uuid_generate...

正确的语法是什么?

【问题讨论】:

  • 您在数据类型 as documented in the manual 之前缺少 type 关键字,但您不能将整数转换为 UUID,因此即使使用正确的语法,如果您有行,这也不起作用在表中。

标签: sql postgresql uuid alter alter-column


【解决方案1】:
CREATE TABLE IF NOT EXISTS people (
id uuid NOT NULL CONSTRAINT people_pkey PRIMARY KEY,
address varchar,
    city varchar(255),
    country varchar(255),
    email varchar(255),
    phone varchar(255)
); 

这是在 postgres SQL 中创建表的正确语法,最好在开始时执行这些约束以避免任何错误。 要使用 alter 命令,您需要执行以下操作:

ALTER TABLE customer ADD COLUMN cid uuid PRIMARY KEY;

在编写小写或未定义命令时可以发现的大多数错误更正表名或列。

【讨论】:

  • 我试过这个并收到错误消息“错误:在“id”或附近出现语法错误第 1 行:alter table people alter column add id uuid using (uuid_gene..."
  • ALTER TABLE people ADD COLUMN id uuid people_pkey;
  • 你可以在 postgres 的网站上看到:postgresqltutorial.com/postgresql-alter-table try that command
  • 对我来说,我有一个名为 people 的数据库,它下面有一个名为 customer 的表,我确实尝试过这个命令,它运行良好 ALTER TABLE customer ADD COLUMN cid uuid PRIMARY KEY;试试看你是否仍然遇到这个错误
  • 对不起,是的,我不能这样做,我编辑了它,所以没有人可以尝试第二个,感谢提醒我:D。
【解决方案2】:

首先uuid_generate_v4() 是一个由名为uuid-ossp 的扩展提供的函数。您应该使用以下方式安装该扩展程序;

CREATE EXTENSION uuid-ossp;

Postgresql 13 引入了一个新功能,该功能基本相同,无需安装扩展。函数调用gen_random_uuid()

假设我们有一张像下面这样的表格;

CREATE TABLE people (
   id bigserial primary key,
   data text
);

bigserial 不是真正的类型。这是一个宏,它基本上创建了具有默认值和序列的 bigint 列。默认值为该序列的下一个值。

对于您的用例,要更改数据类型,您首先应该删除旧的默认值。然后,改变类型,最后添加新的默认值表达式。这是示例:

ALTER TABLE people
  ALTER id DROP DEFAULT,  
  ALTER id TYPE uuid using (gen_random_uuid() /* or uuid_generate_v4() */ ), 
  ALTER id SET DEFAULT gen_random_uuid() /* or uuid_generate_v4() */ ;

【讨论】:

  • 另外,删除现在孤立的序列:DROP SEQUENCE public.people_id_seq; 或使用SELECT pg_get_serial_sequence('public.people', 'id'); 找到实际的序列名称,请参阅:stackoverflow.com/a/59233169/939860
  • 从 Postgres 13 开始,不再需要安装扩展。该版本引入了内置方法gen_random_uuid
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2021-12-24
  • 1970-01-01
相关资源
最近更新 更多