2012-02-28 47 views
56

Tôi có một bảng nhỏ (~ 30 hàng) trong cơ sở dữ liệu Postgres 9.0 của mình với trường ID nguyên (khóa chính) hiện có chứa số nguyên tuần tự duy nhất bắt đầu từ 1, nhưng không được tạo bằng từ khóa 'nối tiếp'.Thêm 'nối tiếp' vào cột hiện tại trong Postgres

Làm cách nào tôi có thể thay đổi bảng này sao cho từ bây giờ chèn vào bảng này sẽ khiến trường này hoạt động như thể nó đã được tạo bằng 'nối tiếp' làm kiểu?

Trả lời

86

Xem các lệnh sau (đặc biệt là khối nhận xét).

DROP TABLE foo; 
DROP TABLE bar; 

CREATE TABLE foo (a int, b text); 
CREATE TABLE bar (a serial, b text); 

INSERT INTO foo (a, b) SELECT i, 'foo ' || i::text FROM generate_series(1, 5) i; 
INSERT INTO bar (b) SELECT 'bar ' || i::text FROM generate_series(1, 5) i; 

-- blocks of commands to turn foo into bar 
CREATE SEQUENCE foo_a_seq; 
ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq'); 
ALTER TABLE foo ALTER COLUMN a SET NOT NULL; 
ALTER SEQUENCE foo_a_seq OWNED BY foo.a; -- 8.2 or later 

SELECT MAX(a) FROM foo; 
SELECT setval('foo_a_seq', 5); -- replace 5 by SELECT MAX result 

INSERT INTO foo (b) VALUES('teste'); 
INSERT INTO bar (b) VALUES('teste'); 

SELECT * FROM foo; 
SELECT * FROM bar; 
+0

Vì bạn đang nhắc đến khóa chính trong bạn OP, bạn cũng có thể muốn 'ALTER TABLE foo THÊM PRIMARY KEY (a)'. –

23

Bạn cũng có thể sử dụng START WITH để bắt đầu một chuỗi từ một điểm cụ thể, mặc dù setval hoàn thành điều tương tự, như trong câu trả lời Euler, ví dụ:

SELECT MAX(a) + 1 FROM foo; 
CREATE SEQUENCE foo_a_seq START WITH 12345; -- replace 12345 with max above 
ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq'); 
Các vấn đề liên quan