SQL Server 2008: Las columnas de la tabla no coinciden con una clave primaria o restricción única existente


Necesito hacer algunos cambios en una base de datos SQL Server 2008.

Esto requiere la creación de una nueva tabla e insertar una clave foránea en la nueva tabla que haga referencia a la clave primaria de una tabla ya existente. Así que quiero establecer una relación entre mi nuevo tblTwo, que hace referencia a la clave primaria de tblOne.

Sin embargo, cuando intenté hacer esto (a través de SQL Server Management Studio) obtuve el siguiente error:

Las columnas de la tabla 'tblOne' no hacer coincidir una clave primaria existente o Restricción ÚNICA

No estoy muy seguro de lo que esto significa, y me preguntaba si había alguna manera de evitarlo.

Author: 109221793, 2011-01-12

10 answers

Significa que la clave primaria en tblOne no ha sido declarada correctamente - necesita ir a tblOne y agregar la restricción de CLAVE PRIMARIA de nuevo en ella.

Si está seguro de que tblOne tiene una restricción de CLAVE PRIMARIA, entonces tal vez haya varias tablas tblOne en su BD, pertenecientes a diferentes esquemas, y su cláusula references en su restricción FK está eligiendo la incorrecta.

Si hay una clave compuesta (que tu comentario indicaría), entonces tienes que incluir ambas columnas en su referencia de clave foránea también. Tenga en cuenta que una tabla no puede tener varias claves principales, pero si tiene una clave compuesta, verá un símbolo de clave junto a cada columna que forma parte de la clave principal.

 70
Author: Damien_The_Unbeliever,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-12 11:07:17

Si tiene una clave compuesta, el orden es importante al crear un FK, y a veces el orden no es la forma en que se muestra.

Lo que hago es ir a la sección Keys de la tabla1 y seleccionar script primary key como create to clipboard y luego crear FK usando el orden como se muestra en script

 48
Author: alanh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-27 19:33:47

Si todavía obtiene ese error después de haber seguido todos los consejos de las respuestas anteriores y todo parece correcto.

Una forma de solucionarlo es eliminando las claves principales de ambas tablas, Guardándolas, Actualizándolas y añadiéndolas de nuevo. A continuación, trate de añadir su relación de nuevo.

 5
Author: Ruan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-17 15:22:36

He tenido esta situación que me llevó a este tema. El mismo error pero otra causa. Tal vez ayude a alguien.

Table1
ColA (PK)
ColB (PK)
ColC


Table2
ID (PK)
ColA
COLB

Al intentar crear clave foránea en Table2 he elegido valores de combobox en orden inverso

Table1.ColB = Table2.ColB
Table1.ColA = Table2.ColA

Esto me estaba lanzando un error como en el nombre del tema. Crear FK manteniendo el orden de las columnas en la tabla de claves primarias tal como están, hizo que el error desapareciera.

Estúpido, pero.. :)

 4
Author: 100r,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-21 16:03:59

Este problema me atrapó, estaba agregando la relación en la mesa equivocada. Así que si está tratando de agregar una relación en la tabla A a la tabla B, intente agregar la relación en la tabla B a la tabla A.

 2
Author: Richard Pursehouse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-21 19:03:05

Este Error ocurrió conmigo When traté add foreign key restricción a partir de PrimaryKey Table

Simpy ir a otra tabla y y create this foreign key restricción from hay (foreign key Table)

 2
Author: Basheer AL-MOMANI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-22 07:02:49

Parece que está intentando crear una clave foránea en tblTwo que no coincide (ni participa) con ninguna clave primaria o índice único en tblOne.

Compruebe este enlace en MSDN con respecto a él. Aquí tienes otro enlace con un caso práctico .

EDITAR:

Respondiendo a su comentario, entiendo que quiere decir que hay 2 campos en la clave primaria (lo que lo convierte en un compuesto). En SQL no es posible tener 2 claves primarias en el mismo tabla.

EN mi humilde opinión, un campo de clave foránea siempre debe referirse a un solo registro en la tabla referenciada (es decir, toda la clave primaria en su caso). Eso significa que necesita poner ambos campos de la clave primaria tblOne en tblTwo antes de crear la clave foránea.

De todos modos, he investigado un poco a través de Internet y parece que SQL Server 2008 (como algunas versiones anteriores y otros RDBMS) le da la posibilidad de hacer referencia solo a una parte de la clave primaria, siempre y cuando esta parte es un candidato clave (No Null y Único) y se crea una restricción única en él.

No estoy seguro de que pueda usar eso en su caso, pero consulte este enlace para obtener más información al respecto.

 0
Author: Guillem Vicens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-14 11:21:05

He encontrado que los nombres de las columnas deben coincidir.

Ejemplo: Por lo tanto, si tblOne tiene id llamado CategoryID, una referencia en tblTwo también debe llamarse CategoryID.

_tblname, primary key name, foreign key_
tblOne, "categoryId", none
tblTwo, "exampleId", "categoryId"

Noté esto al intentar crear una clave foránea entre 2 tablas que tenían el nombre de columna "id" como clave primaria.

 0
Author: Per G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-27 14:01:21

Si nada ayuda, entonces esta podría ser la razón: Considerando este caso: Cuadro A: Columna 1 (Clave primaria) Columna 2 (Clave Primaria) Columna 3 Columna 4

Cuadro B: Columna a (Clave primaria) Columna b Columna c

Cuando está definiendo una dependencia B a A, entonces se ve obligado a respetar el orden en el que se definen las primarias.

Eso significa que tu dependencia debería tener este aspecto: Cuadro A Cuadro B Columna 1 Columna b Columna 2 Columna c

Y NI: Cuadro A Cuadro B Columna 2 Columna c Columna 1 Columna b

Entonces esto conducirá al error que está encontrando.

 0
Author: Samsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-28 08:09:01

He encontrado otra forma de obtener este error. Esto también puede ocurrir si está intentando crear una clave externa recursiva (una clave externa a la clave principal de la misma tabla) en la vista diseño en SQL Management Studio. Si aún no ha guardado la tabla con la clave principal, devolverá este mensaje. Simplemente guarde la tabla y luego le permitirá crear la clave externa.

 0
Author: Caimen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-13 20:24:47