我有一张现有数据表。有没有办法添加主键而不删除并重新创建表?如何在PostgreSQL中将自动递增主键添加到现有表中?
回答
(更新 - 感谢谁评论人)
的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的最新版本中,这大致等同于上面的单个命令。
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
这是所有你需要:
- 添加
id
列 - 用序列填充它从1到COUNT(*)。
- 将其设置为主键/不为空。
感谢评论中给出了这个答案的@resnyanskiy。
这应该被标记为答案,答案应该属于@resnyanskiy – 2016-05-16 09:50:50
我在这里降落是因为我也在寻找类似的东西。在我的情况下,我将一组具有许多列的登台表中的数据复制到一个表中,同时将行ID分配给目标表。这是我使用的上述方法的一个变体。 我在目标表的末尾添加了串行列。这样我就不必在Insert语句中有一个占位符了。然后一个简单的选择*到目标表中自动填充此列。以下是我在PostgreSQL 9.6.4上使用的两条SQL语句。
ALTER TABLE target ADD COLUMN some_column SERIAL;
INSERT INTO target SELECT * from source;
要在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/。
这个解决方案的问题是如果表已经包含行,那么你会得到一个错误:SQL错误[23502]:错误:列“id”包含空值“ – isapir 2018-03-07 16:30:07
- 1. 现有表中添加自动递增的主键 - SQL
- 2. SQL Server将自动增加主键添加到现有表
- 3. 如何将代理自动增加键添加到表中?
- 4. 将主键添加到现有表
- 5. 将主键添加到现有表
- 6. 将自动增量列添加到现有的红移表中
- 7. 如何将外键链接到Oracle中自动递增的主键?
- 8. 从其他表的自动递增主键的列向表中添加数据
- 9. 将自动增量主键插入到外键表中
- 10. 如何将自动增量添加到mongodb/node.js中的现有集合中?
- 11. 将主键列添加到现有的mysqli数据库表中
- 12. 加入恒等式(自动递增),以现有的表的主键
- 13. 插入自动增量主键到现有表
- 14. oracle自动增加到主键
- 15. 如何将外键添加到现有的SQLite表中?
- 16. 将自动增量主键添加到使用SELECT语句创建的表格
- 17. 如何根据列的顺序添加自动增量主键?
- 18. 如何将具有自动增量名称的列添加到MySql表中?
- 19. 如何增加“主键”自动增加数量?
- 20. 如何将新列添加到现有的复合主键
- 21. 将外键添加到现有表
- 22. SQL将外键添加到现有表
- 23. 如何在数组中添加自动递增数字?
- 24. 使用saveToCassandra时自动递增主键()
- 25. mysql自动递增主键耗尽
- 26. 向表添加行 - 主键/自动增量错误(System.Data.SQLite)
- 27. 当在MySQL中添加一列时,有一列等于[自动增量]主键
- 28. 如何将新主机添加到kubernetes中的现有Ingress中?
- 29. 无法主键/唯一键/自动递增加入此列
- 30. PostgreSQL没有自动递增功能?
UPDATE test1 SET id = DEFAULT;也适用。 – 2010-05-31 15:57:39
我使用的是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
请注意,'ADD PRIMARY KEY'也会按照预期和想要创建'NOT NULL'约束(在postgres 9.3中进行测试)。 – 2014-02-07 20:36:53