La estructura de la tabla de ejemplo a continuación da un ERROR: no hay una restricción única que coincida con las claves dadas para la tabla referenciada, y después de haberla observado durante un tiempo, ahora no puedo entender por qué surge este error en esta situación.
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;
Ejecutar el código anterior da el siguiente error, que no tiene sentido para mí, ¿alguien puede explicar por qué surge este error? Estoy usando 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
fuente
fuente
En postgresql, todas las claves externas deben hacer referencia a una clave única en la tabla primaria, por lo que en su
bar
tabla debe tener ununique (name)
índice.Ver también http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK y específicamente:
El énfasis es mío.
fuente
cuando lo hace
UNIQUE
como una restricción de nivel de tabla como lo ha hecho, entonces lo que define es un poco como una clave primaria compuesta, vea las restricciones ddl , aquí hay un extractoEsto significa que cualquiera de los campos podría tener un valor no único siempre que la combinación sea única y no coincida con la restricción de clave externa.
lo más probable es que desee que la restricción esté en el nivel de columna. así que en lugar de definirlos como restricciones de nivel de tabla, 'anexar'
UNIQUE
al final de la definición de columna comoname VARCHAR(60) NOT NULL UNIQUE
o especificar restricciones de nivel de tabla individuales para cada campo.fuente
Debe tener una columna de nombre como restricción única. Aquí hay 3 líneas de código para cambiar sus problemas
Primero descubra las restricciones de la clave principal escribiendo este código
te muestran así en la parte inferior
"some_constraint" PRIMARY KEY, btree (column)
Descarte la restricción:
Agregue una nueva columna de clave principal con una existente:
Eso es todo.
fuente