2012-02-26 20 views
24

Làm cách nào để tạo chuỗi trên bảng để nó chuyển từ 0 -> Giá trị tối đa? Tôi đã thử sử dụng mã SQL sau đây, nhưng nó không chèn thêm bất kỳ giá trị vào bảng mà tôi đang sử dụng:Tạo chuỗi trên bảng hiện có

CREATE SEQUENCE rid_seq; 
ALTER TABLE test ADD COLUMN rid INTEGER; 
ALTER TABLE test ALTER COLUMN rid SET DEFAULT nextval('rid_seq'); 

Bảng Tôi cố gắng để chèn chuỗi trong là sản phẩm từ truy vấn khác. Tôi không thể tìm hiểu xem nó có ý nghĩa hơn khi thêm chuỗi trong truy vấn ban đầu này hay để thêm chuỗi vào bảng sau khi truy vấn được thực hiện.

Trả lời

-3

Tôi không thông thạo postgresql vì vậy tôi không quen thuộc với câu lệnh "TẠO TẠO". Tuy nhiên, tôi sẽ nghĩ rằng bạn đang thêm định nghĩa cột chính xác. Tuy nhiên, việc thêm cột không tự động chèn dữ liệu cho các hàng hiện có. Ràng buộc DEFAULT dành cho các hàng mới. Hãy thử thêm một cái gì đó như thế này sau đó để điền dữ liệu vào các hàng hiện có.

DECLARE @i Int 
SET @i = 0 
SET ROWCOUNT 1 
WHILE EXISTS (SELECT 1 FROM test WHERE rid IS NULL) BEGIN 
    UPDATE test SET rid = @i WHERE rid IS NULL 
END 
SET ROWCOUNT 0 
+0

Cảm ơn bạn đã trích đoạn nội dung. Tôi đang chạy vào lỗi cú pháp khi tôi cố gắng chạy nó: 'tại hoặc gần @'. Tôi không quen thuộc với định nghĩa biến trong Postgreqsl vì vậy tôi không chắc chắn nếu có cái gì đó rõ ràng tôi cần phải thay đổi. – djq

+0

(1) Hình như SQL Server hoặc cú pháp MySQL có thể, nó sẽ không hoạt động trong PostgreSQL. (2) Điều đó sẽ gây ra một số rắc rối ngay sau khi các hàng mới được thêm vào khi bạn không sử dụng hết các giá trị từ chuỗi, giá trị tiếp theo xuất hiện trong chuỗi sẽ là 1 mặc dù bạn đã sử dụng nó cho một ' rid'. –

+0

Bắt tốt, [mu quá ngắn] (http://stackoverflow.com/users/479863/mu-is-too-short), về việc không sử dụng hết các giá trị chuỗi. Và có, tôi khá tốt trong việc viết mã MS SQL Server (mà tôi sẽ giải quyết vấn đề này một chút khác đi) và không quen thuộc với PostgreSQL.Điểm mà tôi đã cố gắng tạo ra là sự khác biệt giữa việc xác định ràng buộc và áp dụng nó, câu trả lời được giải thích tốt hơn là I. –

37

Thiết lập giá trị mặc định khi bạn thêm cột mới:

create sequence rid_seq; 
alter table test add column rid integer default nextval('rid_seq'); 

Thay đổi giá trị mặc định cho các cột hiện tại không thay đổi dữ liệu hiện có do cơ sở dữ liệu không có cách nào để biết mà giá trị nên được thay đổi ; không có cột "cột này có giá trị mặc định" trên giá trị cột, chỉ có giá trị mặc định (ban đầu là NULL vì bạn không chỉ định bất kỳ thứ gì khác) và giá trị hiện tại (cũng là NULL) nhưng cách để biết sự khác biệt giữa "NULL bởi vì nó là mặc định "và" NULL vì nó được thiết lập rõ ràng thành NULL ". Vì vậy, khi bạn thực hiện theo hai bước:

  1. Thêm cột.
  2. Thay đổi giá trị mặc định.

PostgreSQL sẽ không áp dụng giá trị mặc định cho cột bạn vừa thêm. Tuy nhiên, nếu bạn thêm cột và cung cấp giá trị mặc định cùng một lúc thì PostgreSQL không biết những hàng nào có giá trị mặc định (tất cả chúng) để nó có thể cung cấp các giá trị khi cột được thêm vào.

Bằng cách này, bạn có thể muốn có một NOT NULL vào cột đó quá:

create sequence rid_seq; 
alter table test add column rid integer not null default nextval('rid_seq'); 

Và, như a_horse_with_no_name ghi chú, nếu bạn chỉ có ý định sử dụng rid_seq cho cột test.rid của bạn sau đó bạn có thể muốn set its owner column để test.rid để các chuỗi sẽ được giảm nếu cột được lấy ra:

alter sequence rid_seq owned by test.rid; 
+3

Bạn cũng có thể muốn đặt cột đó là "chủ sở hữu" của chuỗi, để PostgreSQL biết rằng thuộc về cột đó: 'thay đổi thứ tự rid_sequence chủ sở hữu để test.rid' –

+0

là nó có thể làm cho tùy chỉnh giá trị chuỗi như" REQ0001-REQ000N "trong bảng hiện có? – Angger

+0

@Angger Sequences là số nên không thực sự. Bạn có thể giả mạo nó bằng cách nối hai cột mặc dù hoặc ghép một chuỗi với một chuỗi độc lập. –

1

Trong PostgreSQL:

UPDATE your_table SET your_column = nextval('your_sequence') 
WHERE your_column IS NULL; 
Các vấn đề liên quan