2011-11-03 28 views
5

Gần đây tôi đã di chuyển cơ sở dữ liệu từ mysql sang pgsql 9.Cài đặt Postgresql tiếp theo để ghi vào

Nhưng bây giờ khi tôi cố gắng tạo đối tượng mới (trong django admin) nó cho tôi biết rằng id tôi đang cố gắng để sử dụng (bắt đầu tại một và đã tăng lên mỗi lần tôi cố gắng) đã được sử dụng.

Tôi đoán rằng có một con trỏ hoặc chỉ mục cần được đặt thành id được sử dụng lần cuối. Tôi có đúng không?

+0

Bạn có thể đặt loại cột thành 'serial' và postgreSQL sẽ tự động tạo một chuỗi cho bạn. – Johan

+0

Tôi gần như chắc chắn rằng nó là, kể từ khi bảng được tạo ra bởi django. – demux

+0

Tôi tìm thấy câu trả lời ở đây: http://stackoverflow.com/questions/1709705/postgresql-nextval-generating-existing-values ​​ – demux

Trả lời

7

Khi bạn xác định bảng của bạn, PostgreSQL tương đương với 'auto_increment' là:

CREATE TABLE foo (
    id SERIAL, 
    ... 
); 

Nếu bảng của bạn đã được tạo ra (như tôi nghi ngờ nó là), bạn có thể thêm điều này bằng tay:

CREATE SEQUENCE foo_id_seq; 
ALTER TABLE foo ALTER COLUMN id SET DEFAULT nextval('foo_id_seq'); 

Lưu ý rằng nếu bạn muốn gắn với tên mặc định mà Pg sẽ cung cấp cho bạn, hãy sử dụng định dạng sau cho tên chuỗi của bạn:

<table name>_<column name>_seq 

Vì vậy, trong ví dụ của tôi, foo_id_seq.

+0

Đã có một bảng và một chuỗi được tạo bởi django. Vì vậy, tôi không phải tạo chuỗi và thay đổi bảng. Nhưng những gì đã làm việc là: chọn setval ('uploads_id_seq', 6965); (tải lên là tên bảng) – demux

2

Nếu bảng đã được di chuyển và nó sử dụng nối tiếp để thay thế cột tăng tự động mysql, dữ liệu của bạn có lẽ đã được di chuyển mà không cần tăng trình tự nối tiếp. Tra cứu hàm postgresql setval để đặt chuỗi của bạn thành một giá trị phía trên khóa hiện tại cao nhất trong bảng của bạn.

+0

Tôi tìm thấy nó ở đây: http://www.postgresql.org/docs/current/static/functions-sequence.html Tôi mới đến postgresql; bạn có thể cho thấy một ví dụ? – demux

+0

'SELECT setval ('nameOfSequence', 42);' – Ketema

Các vấn đề liên quan