我有一个包含现有数据的表格.有没有一种方法可以在不删除和重新创建表的情况下添加主键?

推荐答案

(Updated - Thanks to the people who commented)

Modern Versions of PostgreSQL

假设您有一个名为test1的表,您想在其中添加一个自动递增的主键id(代理项)列.在最新版本的PostgreSQL中,以下命令应该足够了:

   ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;

Older Versions of PostgreSQL

在旧版本的PostgreSQL(8.x之前?)中你不得不做所有的脏活.下面的命令序列应该可以做到这一点:

  ALTER TABLE test1 ADD COLUMN id INTEGER;
  CREATE SEQUENCE test_id_seq OWNED BY test1.id;
  ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
  UPDATE test1 SET id = nextval('test_id_seq');

同样,在最新版本的Postgres中,这大致相当于上面的单个命令.

Postgresql相关问答推荐

优化PostgreSQL查询以将用户插入数据库

如何高效地将行聚合到数组中,同时保留`NULL`来指示丢失的数据?

包含JSONB属性的过滤器的索引策略

如何在PostgreSQL中以行值的形式获取列

为什么Postgres在打印时能完全缩短时间跨度?

PostgreSQL 连接字符串的正则表达式

Postgres 生成的列不是不可变的

具有有限字母表的自定义字符串类型

如何将 NULL 值插入 UUID 而不是零

Postgis 不只使用索引扫描

Rails:创建删除表级联迁移

PostgreSQL ORDER BY 问题 - 自然排序

SQL:列为某个值时的唯一约束

子查询的自连接

Rails:PG :: InsufficientPrivilege:错误:permission denied for relation schema_migrations

PostgreSQL 中跨多个表的索引

在 postgresql 中获取上个月的数据

使用 Postgresql 数据库(OSX Lion)创建 Rails 3.1 应用程序

如何获取一个月的天数?

PostgreSQL - 如何将数字字段中的秒数转换为 HH:MM:SS