Wiele kluczy podstawowych w PostgreSQL

13

Mam następującą tabelę:

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);

Kiedy próbuję przywrócić go za pomocą następującego polecenia:

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

daje mi ten błąd:

wiele kluczy podstawowych dla słowa „tabela” nie jest dozwolone

Jak mogę używać wielu kluczy podstawowych w Postgresie?

mostafa
źródło

Odpowiedzi:

26

Jak mogę używać wielu kluczy podstawowych w Postgresie?

Nie możesz Jest to oksymoron - definicja klucza podstawowego jest taka, że ​​jest to klucz podstawowy, liczba pojedyncza. Nie możesz mieć więcej niż jednego.

Możesz mieć wiele uniqueograniczeń. Możesz mieć klucz podstawowy zawierający wiele kolumn (złożony klucz podstawowy). Ale nie możesz mieć więcej niż jednego klucza podstawowego do tabeli.

Jednak wyświetlany kod nie powoduje wystąpienia wspomnianego błędu:

$ 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
$

Domyślam się, że już zdefiniowałeś tę tabelę i ignorujesz poprzednie błędy, a następnie wyświetlasz tylko ostatni. Jeśli ponownie uruchomię ten kod, otrzymam wynik:

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

Prawdziwy błąd tutaj jest oczywiście pierwszy.

Gorąco polecam zawsze używając -v ON_ERROR_STOP=1w psql, na przykład:

$ 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
$

Zobacz, jak to się kończy przy pierwszym błędzie?

(Byłoby to ustawienie domyślne, ale zepsułoby to kompatybilność wsteczną).

Craig Ringer
źródło