2010-05-31 88 views

回答

195

更新 - 感谢谁评论人)

的PostgreSQL

的现代版本

假设你有一个名为test1到要添加一个自动递增的表,主键id(代理)栏。下面的命令应该在最新版本的PostgreSQL的足够:在PostgreSQL

ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY; 

旧版本(到8.x前?),你必须做所有的脏活旧版本的PostgreSQL。下面的命令序列应该可以做到这一点:

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的最新版本中,这大致等同于上面的单个命令。

+24

UPDATE test1 SET id = DEFAULT;也适用。 – 2010-05-31 15:57:39

+3

我使用的是ORACLE,所以分享它可能对ORACLE家伙有用在ORACLE中:ALTER TABLE TEST1 ADD ID NUMBER; UPDATE TEST1 SET ID = TEST1_SEQ.NEXTVAL; ALTER TABLE TEST1添加主键(ID);在执行UPDATE语句之前创建一个序列TEST1_SEQ – msbyuva 2011-06-22 20:19:02

+0

请注意,'ADD PRIMARY KEY'也会按照预期和想要创建'NOT NULL'约束(在postgres 9.3中进行测试)。 – 2014-02-07 20:36:53

37
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY; 

这是所有你需要:

  1. 添加id
  2. 用序列填充它从1到COUNT(*)。
  3. 将其设置为主键/不为空。

感谢评论中给出了这个答案的@resnyanskiy。

+2

这应该被标记为答案,答案应该属于@resnyanskiy – 2016-05-16 09:50:50

0

我在这里降落是因为我也在寻找类似的东西。在我的情况下,我将一组具有许多列的登台表中的数据复制到一个表中,同时将行ID分配给目标表。这是我使用的上述方法的一个变体。 我在目标表的末尾添加了串行列。这样我就不必在Insert语句中有一个占位符了。然后一个简单的选择*到目标表中自动填充此列。以下是我在PostgreSQL 9.6.4上使用的两条SQL语句。

ALTER TABLE target ADD COLUMN some_column SERIAL; 
INSERT INTO target SELECT * from source; 
0

要在V10使用标识列,

ALTER TABLE test 
ADD COLUMN id { int | bigint | smallint} 
GENERATED { BY DEFAULT | ALWAYS } AS IDENTITY PRIMARY KEY; 

身份列的说明,请参阅https://blog.2ndquadrant.com/postgresql-10-identity-columns/

有关GENERATED BY DEFAULT和GENERATED ALWAYS之间的差异,请参见https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/

要更改序列,请参阅https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/

+0

这个解决方案的问题是如果表已经包含行,那么你会得到一个错误:SQL错误[23502]:错误:列“id”包含空值“ – isapir 2018-03-07 16:30:07

相关问题