Pregunta ¿Qué está causando ERROR: no hay una restricción única que coincida con las claves dadas para la tabla referenciada?


A continuación, la estructura de la tabla de ejemplo muestra un ERROR: no existe una restricción única que coincida con las claves dadas para la tabla referenciada, y al haberla observado mientras que 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 proporciona 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

74
2017-08-15 08:48


origen


Respuestas:


Es porque el name columna en el bar la mesa no tiene el ÚNICO restricción.

Entonces imagina que tienes 2 filas en el bar tabla que contiene el nombre 'ams' e inserta una fila en baz con 'ams' en bar_fk, que fila en bar ¿se estaría refiriendo ya que hay dos filas coincidentes?


82
2017-08-15 09:00



En postgresql todas las claves foráneas deben hacer referencia a llave unica en la tabla padre, en tu bar mesa debe tener un unique (name) índice.

Ver también http://www.postgresql.org/docs/9.1/static/ddl-constraints.html#DDL-CONSTRAINTS-FK y específicamente:

Finalmente, debemos mencionar que una clave externa debe hacer referencia a las columnas   que o bien son una clave principal o forman una restricción única.

Énfasis mío


47
2017-08-15 08:54



Cuando tu lo hagas UNIQUE como una restricción de nivel de tabla como lo ha hecho, entonces lo que su definición es un poco como una clave primaria compuesta ver ddl restricciones, aquí hay un extracto

"This specifies that the *combination* of values in the indicated columns is unique across the whole table, though any one of the columns need not be (and ordinarily isn't) unique."

esto significa que cualquiera de los campos podría tener un valor no exclusivo siempre que el combinación es único y esto no coincide con su restricción de clave externa.

lo más probable es que desee que la restricción esté a nivel de columna. entonces, en lugar de definirlos como restricciones de nivel de tabla, 'anexar' UNIQUE al final de la definición de la columna como name VARCHAR(60) NOT NULL UNIQUE o especifique restricciones de nivel de tabla individuales para cada campo.


4
2017-08-15 09:09



Debería tener la columna de nombre como una restricción única. aquí hay 3 líneas de código para cambiar sus problemas

1.Primero descubra las restricciones de la clave principal escribiendo este código

\ d table_name

te muestran así en la parte inferior     "some_constraint" PRIMARY KEY, btree (columna)

2. Haz clic en la restricción:

ALTER TABLE table_name DROP CONSTRAINT some_constraint

3.Agregue una nueva columna de clave principal con una existente:

ALTER TABLE table_name ADD CONSTRAINT some_constraint PRIMARY KEY (COLUMN_NAME1, COLUMN_NAME2);

Eso es todo.


1
2018-01-17 06:43