SQL Servidor ¿por qué estoy recibiendo error para crear restricciones de llave extranjera para no coincidir clave en tabla de referencia?

Recibo este error de SQL Server:

Msg 1776, Level 16, State 0, Line 64
No hay claves primarias o candidatas en la tabla de referencia 'Orders' que coincida con la lista de columnas de referencia en la llave extranjera 'FK_Cart_Orders'.

Sin embargo, el OrderID la columna está en Orders mesa, así que no puedo entender por qué el error dice que no hay claves iguales en la Orders mesa. Obviamente estoy haciendo algo mal pero no sé qué es.

Mi código es bastante corto y es:

CREATE DATABASE TestMattressSite
GO

USE TestMattressSite
GO

CREATE TABLE Mattresses 
(
    MattressID INT IDENTITY NOT NULL,
)
GO

CREATE TABLE Customers 
(
    CustomerID INT IDENTITY NOT NULL,
)
GO

CREATE TABLE Orders 
(
    OrderID BIGINT IDENTITY NOT NULL,
    CustomerID INT NOT NULL,
)

CREATE TABLE Cart 
(
    OrderID BIGINT NOT NULL,
    MattressID INT NOT NULL,
    CustomerID INT NOT NULL
)
GO

ALTER TABLE Mattresses 
    ADD CONSTRAINT PK_Mattresses PRIMARY KEY (MattressID)
GO

ALTER TABLE Customers 
    ADD CONSTRAINT PK_Customers PRIMARY KEY (CustomerID)
GO

ALTER TABLE Orders 
    ADD CONSTRAINT PK_Orders PRIMARY KEY (OrderID, CustomerID)
GO

ALTER TABLE Cart 
    ADD CONSTRAINT PK_Cart PRIMARY KEY (OrderID, MattressID)
GO

ALTER TABLE Orders 
    ADD CONSTRAINT FK_Orders_Customers 
        FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID)
GO

ALTER TABLE Cart 
    ADD CONSTRAINT FK_Cart_Mattresses 
            FOREIGN KEY (MattressID) REFERENCES Mattresses (MattressID),
        CONSTRAINT FK_Cart_Orders 
            FOREIGN KEY (OrderID) REFERENCES Orders (OrderID),
        CONSTRAINT FK_Cart_Customers 
            FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID)
GO

¿Puede alguien echar un vistazo y señalar mi error?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por techtrailblazer


3 Respuestas:

  • Desde tu Orders tabla tiene la clave principal en dos columnas OrderID y CustomerID, su clave principal compuesta para que cuando desea referenciar esta clave como llave extranjera cualquier tabla, usted necesita definir toda la columna de clave primaria compuesta, como abajo.

    ALTER TABLE Cart ADD
       CONSTRAINT FK_Cart_Mattresses FOREIGN KEY (MattressID)  REFERENCES Mattresses (MattressID),
       CONSTRAINT FK_Cart_Orders FOREIGN KEY (OrderID, CustomerID) REFERENCES Orders (OrderID, CustomerID),
       CONSTRAINT FK_Cart_Customers FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID)
    GO
    

    O...

    Si quieres que tu llave extranjera tenga una sola columna OrderID, cambiar su clave primaria como esta:

    ALTER TABLE Orders ADD
       CONSTRAINT PK_Orders PRIMARY KEY (
          OrderID
       )
    GO
    

    Con esto, la consulta actual funcionará como es.

    Ya hay una pregunta sobre esto, consulte este enlace.

    Respondida el Dec 18, 2020 a las 04:09 - por codealchemyf00f

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás recibiendo se debe a que la definición de tu restricción de llave primaria en la tabla Orders no es la correcta para poder establecer una llave foránea en la tabla Cart.

    En la tabla Orders, tienes la siguiente definición de la restricción de llave primaria:

    sql
    ALTER TABLE Orders 
        ADD CONSTRAINT PK_Orders PRIMARY KEY (OrderID, CustomerID)
    

    Al definir la llave primaria de esta manera, estás creando una combinación de las columnas OrderID y CustomerID como llave primaria. Sin embargo, en la tabla Cart, estás tratando de establecer una restricción de llave foránea hacia la columna OrderID solamente.

    Para solucionar este problema, puedes cambiar la definición de la llave primaria en la tabla Orders para que solo incluya la columna OrderID de la siguiente manera:

    sql
    ALTER TABLE Orders 
        ADD CONSTRAINT PK_Orders PRIMARY KEY (OrderID)
    

    Con esta modificación, la llave primaria de la tabla Orders estará compuesta solo por la columna OrderID, lo que permitirá establecer la restricción de llave foránea en la tabla Cart hacia esta columna sin problemas.

    Después de hacer este cambio, asegúrate de volver a ejecutar el código para crear las restricciones de llave foránea en la tabla Cart y debería funcionar correctamente.

    Respondida el Dec 19, 2020 a las 04:10 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás recibiendo indica que la tabla Orders no tiene una clave primaria o candidata que coincida con la columna OrderID de la tabla Cart. Esto se debe a que la clave primaria de Orders está definida como (OrderID, CustomerID), y la tabla Cart solo referencia la columna OrderID.

    Para resolver este problema, debes modificar la clave primaria de Orders para que coincida con la columna OrderID referenciada en la tabla Cart. Puedes hacer esto ejecutando el siguiente comando:

    sql
    ALTER TABLE Orders DROP CONSTRAINT PK_Orders;
    ALTER TABLE Orders ADD CONSTRAINT PK_Orders PRIMARY KEY (OrderID);
    

    Una vez que hayas hecho esto, el error debería desaparecer y podrás crear correctamente la restricción de clave externa en la tabla Cart.

    Respondida el Dec 19, 2020 a las 04:17 - por Gemini

    Votos positivos: 0 | Votos negativos: 0