Nhiều khóa chính trong PostgreSQL


13

Tôi có bảng sau:

CREATE TABLE word(
word CHARACTER VARYING NOT NULL,
id BIGINT NOT NULL,
repeat INTEGER NOT NULL
);
ALTER TABLE public.word OWNER TO postgres;
ALTER TABLE ONLY  word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id);

Khi tôi cố gắng khôi phục nó bằng lệnh sau:

psql -U postgres -h localhost -d word -f word.sql 

nó cho tôi lỗi này:

nhiều khóa chính cho bảng "từ" không được phép

Làm cách nào tôi có thể sử dụng nhiều khóa chính trong postgres?

Câu trả lời:


26

Làm thế nào tôi có thể sử dụng nhiều khóa chính trong postgres?

Bạn không thể. Đây là một nghịch lý - định nghĩa của một khóa chính là nó khóa chính, số ít. Bạn không thể có nhiều hơn một.

Bạn có thể có nhiều uniqueràng buộc. Bạn có thể có khóa chính chứa nhiều cột (khóa chính tổng hợp). Nhưng bạn không thể có nhiều hơn một khóa chính cho một bảng.

Tuy nhiên, mã bạn hiển thị không tạo ra lỗi bạn đã đề cập:

$ psql -U postgres regress <<__END__
CREATE TABLE word(
word CHARACTER VARYING NOT NULL,
id BIGINT NOT NULL,
repeat INTEGER NOT NULL
);
ALTER TABLE public.word OWNER TO postgres;
ALTER TABLE ONLY  word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id);
__END__
CREATE TABLE
ALTER TABLE
ALTER TABLE
$

Theo phỏng đoán, bạn thực sự đã xác định bảng này và bạn đang bỏ qua các lỗi trước đó, sau đó chỉ hiển thị lỗi cuối cùng. Nếu tôi chạy lại mã này, tôi nhận được đầu ra:

ERROR:  relation "word" already exists
ALTER TABLE
ERROR:  multiple primary keys for table "word" are not allowed

Lỗi thực sự ở đây là lỗi đầu tiên, tất nhiên.

Tôi khuyên các bạn nên luôn luôn sử dụng -v ON_ERROR_STOP=1trong psql, ví dụ như:

$ psql -v ON_ERROR_STOP=1 -U postgres regress <<__END__
CREATE TABLE word(
word CHARACTER VARYING NOT NULL,
id BIGINT NOT NULL,
repeat INTEGER NOT NULL
);
ALTER TABLE public.word OWNER TO postgres;
ALTER TABLE ONLY  word ADD CONSTRAINT "ID_PKEY" PRIMARY KEY (word,id);
__END__

ERROR:  relation "word" already exists
$

Xem làm thế nào nó dừng lại ở lỗi đầu tiên?

(Nó là mặc định nhưng sẽ phá vỡ tính tương thích ngược).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.