2011-01-12 36 views
44

Necesito hacer algunos cambios en una base de datos de SQL Server 2008.SQL Server 2008: Las columnas de la tabla no coinciden con una clave principal existente o una restricción única

Esto requiere la creación de una nueva tabla, y la inserción de una clave externa en la nueva tabla que hace 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 traté de hacer esto (a través de SQL Server Management Studio) Tengo el siguiente error:

The columns in table 'tblOne' do not match an existing primary key or UNIQUE constraint

No estoy realmente seguro de lo que esto significa, y me preguntaba si había alguna manera ¿alrededor?

Respuesta

63

Significa que la clave principal en tblOne no se ha declarado correctamente: debe ir a tblOne y agregar la restricción PRIMARY KEY de nuevo en ella.

Si está seguro de que tblOne tiene una restricción PRIMARY KEY, entonces tal vez haya varias tablas tblOne en su base de datos, pertenecientes a diferentes esquemas, y su cláusula de referencias en su restricción FK está eligiendo la incorrecta.

Si hay una clave compuesta (que su comentario indicaría), entonces debe 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 clave al lado de cada columna que es parte de la clave principal.

+0

Hola Damien, solo hay un tblOne en la base de datos, y definitivamente tiene un PK. Una cosa que noté (no estuve involucrado en la creación de la base de datos, y rara vez tengo que acercarme a ella) ahora mismo hay dos claves principales en tblOne (¿así que un compuesto?). ¿Esto lo afectaría? – 109221793

+0

Actualicé mi respuesta: debe incluir ambas columnas en su restricción FK –

+0

Si tiene una clave compuesta, asegúrese de haber agregado todas las columnas, y todavía las está obteniendo, consulte la respuesta de alanh a continuación. – Turch

0

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

Compruebe este enlace en MSDN con respecto a él. Aquí tienes otro enlace con un practical case.

EDIT:

Answwering a tu comentario, entiendo que quiere decir que hay 2 campos de la clave principal (que lo convierte en un compuesto). En SQL no es posible tener 2 claves principales en la misma tabla.

En mi humilde opinión, un campo de clave externa siempre debe hacer referencia a un único registro en la tabla referenciada (es decir, la clave primaria completa en su caso). Eso significa que debe colocar ambos campos de la clave primaria tblOne en tblTwo antes de crear la clave externa.

De todos modos, he investigado un poco por Internet y parece que SQL Server 2008 (como algunas versiones anteriores y otros RDBMS) le da la posibilidad de hacer referencia solo a parte de la clave principal siempre que esta parte sea una clave candidata (No nulo y único) y usted crea una restricción única en él.

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

+0

Hola Guillem, una cosa que noté (no participé en la creación de la base de datos, y rara vez tengo que acercarme a ella) ahora mismo hay dos claves primarias en tblOne (¿así que un compuesto?). ¿Esto lo afectaría? – 109221793

+0

Si tblOne tiene una clave primaria compuesta de dos columnas, ambas columnas también deben estar en tblTwo antes de poder establecer una referencia de clave externa de tblTwo a tblOne. –

+0

Edité mi respuesta para aclararlo un poco. :-) –

0

He encontrado que los nombres de columna deben coincidir.

Ejemplo: Así que si tblOne tiene id llamado categoryId, una referencia en tblTwo también se debe llamar categoryId.

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

Me di cuenta de esto al intentar crear una clave foránea entre 2 tablas que tenían el nombre de la columna "id" como clave principal.

+1

Este no es el caso con SQL Server 2008 R2 – Mario

+0

¿Estás seguro? Estoy corriendo 2008 R2 ... –

+1

Sí, los nombres de columna no tienen que coincidir siempre que la relación esté definida – Mario

4

He tenido esta situación que me llevó a este tema. Mismo error pero otra causa. Quizás ayudará a alguien.

Table1 
ColA (PK) 
ColB (PK) 
ColC 


Table2 
ID (PK) 
ColA 
COLB 

Al intentar crear clave externa en la Tabla2 he elegir los valores de cuadro combinado en el orden inverso

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

Esto me estaba lanzando un error como en nombre del tema. Al crear FK para mantener el orden de las columnas en la tabla de clave primaria tal como están, el error desapareció.

estúpida, pero .. :)

0

Si nada ayuda, entonces esto podría ser la razón: Teniendo en cuenta este caso: Tabla A: Columna 1 (clave principal) Columna 2 (clave principal) columna 3 columna 4

Tabla B: columna un (clave principal) columna b columna c

cuando está defini En una dependencia B a A, se ve obligado a respetar el orden en que se definen las primarias.

Eso de decir que su dependencia debería tener este aspecto: Tabla A Tabla B Columna 1 Columna b Columna 2 Columna c

Y NO: Tabla A Tabla B Columna 2 Columna c Columna 1 Columna b

, esto dará lugar al error que está encontrando.

45

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

Lo que hago es ir a la sección de teclas de la tabla 1 y la clave primaria de selección de secuencia de comandos como crear al portapapeles y luego crear FK utilizando el orden como se muestra en la escritura

+2

Es una respuesta principal. Gracias, realmente ayuda. – BigMan

+5

orden incorrecta era el problema para mí –

+0

El problema era el orden incorrecto ... ¡muchas gracias! –

4

Si, a pesar de que el error después de haber seguido todos los consejos de las respuestas anteriores y todo se ve bien.

Una forma de solucionarlo es eliminar las claves principales para ambas tablas, guardar, actualizar y volver a agregarlas. Luego intenta agregar tu relación nuevamente.

+0

Tuve un problema al cambiar la tabla a la que se refería la relación. En lugar de cambiarlo, lo eliminé e hice una nueva relación y tienes razón, terminó funcionando. – Mark

2

Este problema me sorprendió, estaba agregando la relación en la tabla incorrecta. Así que si usted está tratando de agregar una relación en el cuadro A de la tabla B, trate de añadir la relación en el cuadro B de la tabla A.

2

Este error ocurrió conmigo Whenadd foreign key Traté de restricción a partir de PrimaryKey Table

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

0

He encontrado otra manera de obtener este error. Esto también puede suceder si está intentando crear una clave externa recursiva (una clave externa a la clave principal en la misma tabla) en la vista de 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 le permitirá crear la clave externa.

Cuestiones relacionadas