2015-10-28 47 views
0

我创建我的表时犯了一个错误。主键不正确。我删除了约束,现在我的表中没有主键,只有带有数据的字段。现在我想再次设置这个字段为auto_increment主键而不会丢失我的数据。我如何做到这一点? 我tryed这一点:如何在不删除Postgresql中的值的情况下更新列的数据类型?

ALTER TABLE name_table ADD COLUMN name_column serial primary key; 

但有了这个,我失去了我的数据,并创建一个新的专栏,我不想

+0

你试过吗? http://dba.stackexchange.com/questions/8814/how-to-promote-an-existing-index-to-primary-key-in-postgresql – grahamrhay

+0

http://stackoverflow.com/questions/9490014/adding-串到现有的列在Postgres和http://stackoverflow.com/questions/20593946/postgresql-reconfigure-existing-table-changing-primary-key-to-type-serial –

+0

我试过这个解决方案@a_horse_with_no_name ,但没有结果 –

回答

0

试试这个

ALTER TABLE table_name ADD CONSTRAINT some_name primary key (name_column); 
+0

This不会在PostgreSQL中工作 –

+0

是Vivek,你是对的,这是不是在Postgress工作,因为MODIFY –

+0

如何添加新的约束? –

0

对于我的建议,

  1. 在sql或csv或xml或excel中首先备份数据库 可恢复。
  2. 然后改变你的表结构,列数据类型,从用户界面或命令
  3. 那么如果记录在您的表中的数据丢失或消失,恢复 备份数据只(不表的结构)

之后,您已更改列数据类型,并获得您所需的数据。我希望它会起作用。

0

嗨,大家好我是想几种方法,我发现这一个,也许也有人后可以使用:

创建sequenz:Sequenz是PostgreSQL的实现产生AUTO_INCREMENT领域的方式。我们有一个auto_increment也是一个主键。不应该是这样,不是一个规则,但在大多数情况下,auto_increment字段是主键。 创建sequenz是这样的:

CREATE SEQUENCE exemplo_id_seq 
    INCREMENT 1 --the increment upgrate will be made 1 + 1 
    MINVALUE 1 
    MAXVALUE 
    START 1 --the start counting is in 1 
    CACHE 1; 

在这之后仅仅是让使用NEXTVAL这个sequenz到受影响的领域,像这样:

ALTER TABLE table_name ALTER COLUMN id SET DEFAULT NEXTVAL("exemplo_id_seq"::regclass); 

是否工作良好,而不从旧丢失数据错误

+0

这正是我链接到的问题(例如http://stackoverflow.com/q/9490014/330315)的解决方案,您声称它不起作用。 –

+0

嗨@a_horse_with_no_name你是对的!问题在于我刚刚在帖子中阅读了第一个答案,而第二个答案是有点下降,这正是我的解决方案。但是,无论如何。第一个答案看起来有点复杂,我:) –

相关问题