在我的 PostgreSQL 数据库中:
select index from sample;
index
---------
1
2
3
1
2
我想放置index
如下:
select index from sample;
index
---------
1
2
3
4
5
萨达姆汗提供了一个解决办法:
alter table sample add column sort_id serial;
-- Drop column index from sample table.
alter table sample drop column index;
-- Rename column sort_id to index in sample table
alter table sample rename column sort_id to index;
-- Add Primary Key.
alter table sample add primary key(index);
但是现在,该index
列位于右侧(表的末尾)。我怎样才能把它放在左边?
select * from sample;
ticker | roe | income | index
--------+---------+---------+-------
000820 | 2347.63 | 120.16 | 1
300071 | 676.52 | 1035.38 | 2
002188 | 289.69 | 273.95 | 3
600734 | 151.58 | 921.82 | 4
000523 | 139.94 | 2585.55 | 5
600078 | 138.28 | 3333.41 | 6
主键字段旨在是唯一的,而不是顺序的。如果您有任何类型的处理依赖于“订购”的东西,请不要依赖主键来提供它。
您能想象如果您的银行在每次其他人关闭帐户时都对人们的支票帐户重新编号会造成混乱吗?这是一个非常非常糟糕的主意。此外,一旦您有引用这些主键的外键,数据库就真的应该阻止您这样做(不,“级联”更改不是答案。数据库必须做的工作量才能进行此类更改随着每个新的引用表及其中的所有行呈指数增长)。
为什么你觉得这很重要?
您编写的每个 SELECT 语句都应该按照所需的顺序指定所需的列。 永远不要依赖物理表布局,因为正如您所发现的,它可以改变。
数据库本质上是共享实体的,你永远不知道谁 [else] 将在其中(或对?)做什么。
您可以将列更改为
identity
列,然后根据基础序列更新值。现在生成了一个序列,可用于更新现有值以使其唯一:
然后将该列设为主键:
新列添加到列列表的末尾,带有
ALTER TABLE
。您需要重新创建表以获得所需的列顺序。或者
UPDATE
现有的列,这在存在UNIQUE
orPRIMARY KEY
约束的情况下有点棘手(虽然可行)。两者都很昂贵(对于大桌子)并且阻塞。第一种选择总体上可能更便宜,但更具侵入性。通常是具有并发访问的数据库的问题。如果您是唯一的用户,这不是问题。
如果您要编写一个新表,请执行此操作而不是上面显示的所有内容。
必须删除并重新创建对旧表的任何内部引用。比如外键,视图等等。
如果语句中没有目标,新
IDENTITY
列将自动填充其附加的自动递增数字。看:SEQUENCE
INSERT