Abaixo, a estrutura da tabela de exemplo fornece um ERRO: não há nenhuma restrição exclusiva que corresponda às chaves fornecidas para a tabela referenciada e, depois de observá-la por um tempo, não consigo descobrir por que esse erro ocorre nessa situação.
BEGIN;
CREATE TABLE foo (
name VARCHAR(256) PRIMARY KEY
);
CREATE TABLE bar(
pkey SERIAL PRIMARY KEY,
foo_fk VARCHAR(256) NOT NULL REFERENCES foo(name),
name VARCHAR(256) NOT NULL,
UNIQUE (foo_fk,name)
);
CREATE TABLE baz(
pkey SERIAL PRIMARY KEY,
bar_fk VARCHAR(256) NOT NULL REFERENCES bar(name),
name VARCHAR(256)
);
COMMIT;
A execução do código acima fornece o seguinte erro, o que não faz sentido para mim, alguém pode explicar por que esse erro ocorre. Estou usando o postgres 9.1
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "foo_pkey" for table "foo"
NOTICE: CREATE TABLE will create implicit sequence "bar_pkey_seq" for serial column "bar.pkey"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "bar_pkey" for table "bar"
NOTICE: CREATE TABLE / UNIQUE will create implicit index "bar_foo_fk_name_key" for table "bar"
NOTICE: CREATE TABLE will create implicit sequence "baz_pkey_seq" for serial column "baz.pkey"
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "baz_pkey" for table "baz"
ERROR: there is no unique constraint matching given keys for referenced table "bar"
********** Error **********
ERROR: there is no unique constraint matching given keys for referenced table "bar"
SQL state: 42830
sql
postgresql
ams
fonte
fonte
No postgresql, todas as chaves estrangeiras devem fazer referência a uma chave exclusiva na tabela pai, portanto, na sua
bar
tabela, você deve ter umunique (name)
índice.Veja também http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK e especificamente:
Ênfase minha.
fonte
quando você faz
UNIQUE
uma restrição no nível da tabela, como você fez, então qual é a sua definição como uma chave primária composta, veja restrições ddl , aqui está uma extraçãoisso significa que qualquer um dos campos pode ter um valor não exclusivo, desde que a combinação seja única e isso não corresponda à sua restrição de chave estrangeira.
provavelmente você deseja que a restrição esteja no nível da coluna. então, em vez disso, defina-as como restrições no nível da tabela, 'acrescente'
UNIQUE
ao final da definição da coluna, comoname VARCHAR(60) NOT NULL UNIQUE
ou especifique restrições no nível da tabela para cada campo.fonte
Você deve ter a coluna de nome como uma restrição exclusiva. aqui estão três linhas de código para alterar seus problemas
Primeiro, descubra as restrições da chave primária digitando este código
você é mostrado assim na parte inferior
"some_constraint" PRIMARY KEY, btree (column)
Solte a restrição:
Adicione uma nova coluna de chave primária com a existente:
Isso é tudo.
fonte