Tengo un problema común. Leí en todo Google, pero mi problema es un poco más extraño.

Tengo una tabla que uso estas claves primarias:

ALTER TABLE `companies`
   ADD PRIMARY KEY(
     `name_employee`,
     `email`);

Entonces, la clave principal es una combinación de name_employee Y email.

El problema con los ejemplos (solo doy las inserciones de la clave principal, ya que otras no son primarias y funcionan como se esperaba):

Primera inserción OK:

name_employee = 'Pavlos Pavlos'
email = 'company_Name@gmail.com'

Segunda inserción OK:

name_employee = 'John John'
email = 'company_Name@gmail.com'

Tercera inserción MALA:

name_employee = 'Nick Nick'
email = 'company_Name@gmail.com'

Error que aparece:

Error: INSERT INTO empresas (nombre, número de cuenta, dateExp, credit_limit, amount_debt, balance, name_employee, id_employee, correo electrónico, contraseña) SELECCIONAR nombre, número_cuenta, fechaExp, límite_crédito, amount_debt, balance, 'Nick Nick', '250', 'nombre_empresa@gmail.com', 'pase' DE las empresas DONDE email='nombre_empresa@gmail.com ' Entrada duplicada "Nick Nick-company_Name@gmail.com" para la clave "PRIMARY"

Pero no hay otra fila con name_employee = Nick Nick y email = company_Name@gmail.com.

Lo que es realmente extraño es que me permite hacer una segunda inserción con el mismo email pero con un name_employee diferente, pero no me permite hacer lo mismo para un tercero y así sucesivamente. .

¿Alguna ayuda, por favor?

EDITAR: Esta es una asignación y no puedo agregar más claves / claves primarias, etc. También necesito muchos empleados en la misma empresa, y podemos asumir que name_employee es diferente para cada uno, por eso utilicé estas claves primarias.

0
PavTze 12 ene. 2017 a las 00:04
Su inserción-selección está intentando insertar dos filas; ejecute la selección por sí mismo para ver.
 – 
Uueerdo
12 ene. 2017 a las 00:06
1
Probablemente no desee que esa sea la clave principal, hace que los registros sean realmente desagradables de recuperar y un montón de problemas para vincularlos desde otras tablas. Tenga una restricción primaria INT simple y haga una restricción UNIQUE secundaria.
 – 
tadman
12 ene. 2017 a las 00:06
1
Simplemente podría agregar LIMIT 1; sin embargo, yo argumentaría en contra del método que está utilizando en general. No tiene ninguna garantía de que todos los registros con email='company_Name@gmail.com' sean idénticos en todos los demás aspectos que no sean name_employee. Si / cuando eso suceda, los valores que obtenga se elegirán efectivamente al azar. (Si desea almacenar los valores "predeterminados" como una fila, le recomendaría darle a esa fila un name_employee, email único y un DONDE en los valores de ambos campos).
 – 
Uueerdo
12 ene. 2017 a las 00:14
1
Así que ninguno de name, account_number, dateExp, credit_limit, amount_debt, balance y password nunca < / b> cambiar hasta que email se haya cambiado de 'company_Name@gmail.com'? Y para hacernos eco de los demás, ¿por qué eres tan reacio a una consulta INSERT VALUES directa?
 – 
Uueerdo
12 ene. 2017 a las 00:26
1
Todo lo relacionado con esta base de datos es verdaderamente apocalípticamente incorrecto. Viola tantas reglas de normalización que solo puedo suponer que te están sometiendo a esto para mostrarte lo mal que pueden ponerse las cosas. ¡Buena suerte!
 – 
tadman
12 ene. 2017 a las 00:51

1 respuesta

La mejor respuesta

Esta consulta

SELECT 
  name, account_number, dateExp, credit_limit, amount_debt, balance, 
  'Nick Nick', '250', 'company_Name@gmail.com', 'pass' 
FROM companies 
WHERE email='company_Name@gmail.com'

Selecciona filas de la tabla companies donde email es igual a 'company_Name@gmail.com'. Esto es cierto para dos filas ('Pavlos Pavlos' y 'John John'). De modo que está intentando insertar 'Nick Nick' dos veces. De ahí el error.

.

2
Thorsten Kettner 12 ene. 2017 a las 00:11
Lo entiendo, ¿hay alguna manera de seleccionar solo una fila para cada aparición?
 – 
PavTze
12 ene. 2017 a las 00:12
1
¿Por qué seleccionas de la tabla de todos modos? ¿Por qué no utilizar una cláusula de valores en su lugar? ¿Qué es lo que está tratando de lograr aquí?
 – 
Thorsten Kettner
12 ene. 2017 a las 00:13
Parece que necesito cambiarlo si no hay otra forma.
 – 
PavTze
12 ene. 2017 a las 00:16
Podría obtener una fila con una cláusula de límite, por ejemplo, pero me parece extraño elegir un registro arbitrariamente para construir un nuevo registro.
 – 
Thorsten Kettner
12 ene. 2017 a las 00:16
No debería seleccionar de la tabla para insertar nuevos valores como este. Como dice Thorsten, Insertar con valores funcionará.
 – 
Andrew Stalker
12 ene. 2017 a las 00:18