Duplicar la clave primaria en SQL Server

Estoy tratando de hacer una factura para los clientes que compraron productos. Quiero lo mismo ID_Invoice y dentro habrá diferentes productos que el cliente compró.

Quiero que se vea así,

|ID_Invoice | ID_Reg | ID_Product | ProductType | Price |
+-----------+--------+------------+-------------+-------+
|    1      |   1    |  12345     |  Software   |  300  |
|    1      |   1    |  12346     |  Software   |  400  |
|    2      |   3    |  12347     |  Software   |  350  |
|    3      |   4    |  22346     |  Hardware   |  600  |

El mismo cliente (ID_Reg) puede comprar 2 productos diferentes y será en la misma factura (ID_Invoice).

Pero cuando intento insertar valores en Invoice Tengo un error.

Violation of PRIMARY KEY restrictt 'PK_IDInvoice'. No se puede insertar la clave duplicada en el objeto 'dbo.Invocación'. El valor clave duplicado es (1).

Espero haber explicado bien

Pregunta hecha hace 3 años, 4 meses, 27 días - Por bitcraftsman


3 Respuestas:

  • Quieres un invoices tabla donde cada fila representa una sola factura y id_invoice es la clave principal.

    Quieres un invoice_lines o invoice_products tabla que tiene una fila por línea de facturas (o producto). Esa es básicamente la tabla que has descrito anteriormente.

    Dada su descripción, la (id_invoice, id_product) debe ser único en esta tabla. Y id_invoice debe ser una referencia clave extranjera a invoices(id_invoice). Generalmente daría una tabla así identity la clave primaria también.

    Respondida el Dec 20, 2020 a las 14:14 - por scriptsorcerer

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás experimentando se debe a que estás intentando insertar un valor de clave primaria que ya existe en la tabla. Esto sucede porque estás tratando de insertar una factura con un ID_Invoice que ya está en uso en la tabla. La clave primaria debe ser única en la tabla para identificar de manera única cada fila.

    Para resolver este problema, puedes hacer lo siguiente:

    • Asegúrate de que la columna ID_Invoice sea una columna autoincremental (IDENTITY) en tu tabla Invoice. De esta manera, SQL Server se encargará de asignar automáticamente un valor único a cada nueva factura que se inserte.
    • Revisa la configuración de la columna ID_Invoice en tu tabla Invoice para asegurarte de que realmente sea autoincremental e única.
    • Antes de insertar una nueva factura, consulta la tabla Invoice para determinar cuál es el último ID_Invoice utilizado y luego utiliza un valor que sea mayor al último para tu nueva factura.

    Por ejemplo, puedes realizar la inserción de la siguiente manera:

    sql
    INSERT INTO Invoice (ID_Invoice, ID_Reg, ID_Product, ProductType, Price)
    VALUES ((SELECT ISNULL(MAX(ID_Invoice), 0) + 1 FROM Invoice), 1, 12345, 'Software', 300),
           ((SELECT ISNULL(MAX(ID_Invoice), 0) + 1 FROM Invoice), 1, 12346, 'Software', 400);
    

    Esto asegurará que cada nueva factura tenga un ID_Invoice único y evite la duplicación de claves primarias.

    Espero que esta información te sea de ayuda para resolver el problema. Si necesitas más asistencia, no dudes en preguntar.

    Respondida el Dec 21, 2020 a las 14:18 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Entiendo, el error que estás recibiendo se debe a que estás intentando insertar valores duplicados en la clave primaria de la tabla Invoice. Una clave primaria debe ser única para cada fila, lo que significa que no puedes tener dos filas con el mismo valor de clave primaria.

    Para resolver este problema, debes modificar tu consulta de inserción para que no inserte valores duplicados en la clave primaria. Puedes hacerlo utilizando la cláusula INSERT IGNORE o ON DUPLICATE KEY UPDATE.

    Usando la cláusula INSERT IGNORE

    La cláusula INSERT IGNORE te permite insertar filas en una tabla ignorando los errores de clave duplicada. Esto significa que si intentas insertar una fila con un valor de clave primaria duplicado, la fila simplemente se ignorará y no se insertará en la tabla.

    sql
    INSERT IGNORE INTO Invoice (ID_Invoice, ID_Reg, ID_Product, ProductType, Price)
    VALUES (1, 1, 12345, 'Software', 300),
           (1, 1, 12346, 'Software', 400),
           (2, 3, 12347, 'Software', 350),
           (3, 4, 22346, 'Hardware', 600);
    

    Usando la cláusula ON DUPLICATE KEY UPDATE

    La cláusula ON DUPLICATE KEY UPDATE te permite insertar filas en una tabla y actualizar las filas existentes si se encuentra una clave duplicada. Esto significa que si intentas insertar una fila con un valor de clave primaria duplicado, la fila existente se actualizará con los nuevos valores.

    sql
    INSERT INTO Invoice (ID_Invoice, ID_Reg, ID_Product, ProductType, Price)
    VALUES (1, 1, 12345, 'Software', 300),
           (1, 1, 12346, 'Software', 400),
           (2, 3, 12347, 'Software', 350),
           (3, 4, 22346, 'Hardware', 600)
    ON DUPLICATE KEY UPDATE
    SET ID_Invoice = VALUES(ID_Invoice),
        ID_Reg = VALUES(ID_Reg),
        ID_Product = VALUES(ID_Product),
        ProductType = VALUES(ProductType),
        Price = VALUES(Price);
    

    Espero que esto te ayude a resolver el problema de clave primaria duplicada.

    Respondida el Dec 21, 2020 a las 14:19 - por Gemini

    Votos positivos: 0 | Votos negativos: 0