Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: patilanz en 3 Octubre 2015, 12:14 pm



Título: SQLite3 INSERT INTO + EXCEPT [SOLUCIONADO]
Publicado por: patilanz en 3 Octubre 2015, 12:14 pm
Hola tengo una table:

Código
  1. CREATE TABLE `test` (
  2. `ID` INTEGER PRIMARY KEY AUTOINCREMENT,
  3. `name` TEXT NOT NULL,
  4. `number` INT NOT NULL
  5. );
  6. INSERT INTO test VALUES(NULL,'Jose',21)
  7.  

Que al ejecutar:

Código
  1. INSERT INTO test VALUES(NULL,'Jose',21) EXCEPT SELECT * FROM test WHERE name='Jose'

Debería de NO insertar nada, pero si lo hace.

En cambio en esta tabla:
Código
  1. CREATE TABLE `test` (
  2. `name` TEXT NOT NULL,
  3. `number` INT NOT NULL
  4. );
  5. INSERT INTO test VALUES('Jose',21)
  6.  

Al ejecutar:

Código
  1. INSERT INTO test VALUES('Jose',21) EXCEPT SELECT * FROM test WHERE name='Jose'

Funciona perfecto.
El PRIMARY KEY ID hace que no funcione pero no se porque. ??

Un saludo


Título: Re: SQLite3 INSERT INTO + EXCEPT
Publicado por: Carloswaldo en 5 Octubre 2015, 07:24 am
Hola,

Yo no soy experto en SQLite pero creo que puedo deducir lo que está ocurriendo.

Fíjate en la primera tabla, al hacer el primer INSERT, el campo ID (primary key) tomará un valor, digamos '1', así que tendrías el registro (1,'Jose',21). Al tratar de hacer el segundo INSERT, el ID ahora será de '2', dando como resultado el registro (2,'Jose',21). Al hacer la validación, el registro (2,'Jose',21) no es lo mismo que el registro (1,'Jose',21), por lo que la excepción no aplica y se inserta el registro.

En la segunda tabla no hay campo ID, el primer INSERT será el registro ('Jose',21). En el segundo INSERT el registro que se intentará insertar será ('Jose',21), como es idéntico al anterior, la excepción aplica y no se inserta.

Por cierto, ¿por qué quieres hacer esto?, ¿por qué no haces que el campo 'name' sea UNIQUE?


Título: Re: SQLite3 INSERT INTO + EXCEPT
Publicado por: patilanz en 5 Octubre 2015, 07:49 am
Si hay tres campos y ninguno de ellos es el ID único funciona bien porque si hago EXPECT de 2 campos y en la tabla hay tres, el tercero es diferente funciona por lo tanto aunque sea
(1,'Jose',21) (2,'Jose',21) haciendo SELECT * FROM test WHERE name='Jose' AND number=21 debería de funcionar porque en el SELECT no digo que no puede otros campos y si lo ejecuto solo me salen las dos filas pero si lo junto con EXCEPT e INSERT ya nada, como si no se seleccionara nada.

El nombre no es único, es único el nombre mas el numero a la vez, es decir pueden existir campos así: (1,'Jose',21) (2,'Jose',23) pero no (1,'Jose',21) (2,'Jose',21)


Título: Re: SQLite3 INSERT INTO + EXCEPT
Publicado por: Carloswaldo en 5 Octubre 2015, 17:23 pm
Si hay tres campos y ninguno de ellos es el ID único funciona bien porque si hago EXPECT de 2 campos y en la tabla hay tres, el tercero es diferente funciona por lo tanto aunque sea
(1,'Jose',21) (2,'Jose',21) haciendo SELECT * FROM test WHERE name='Jose' AND number=21 debería de funcionar porque en el SELECT no digo que no puede otros campos y si lo ejecuto solo me salen las dos filas pero si lo junto con EXCEPT e INSERT ya nada, como si no se seleccionara nada.

El EXCEPT no trabaja sobre las columnas sino sobre un conjunto de registros. Imagínate que es así:

Código
  1. INSERT INTO test VALUES(NULL,'Jose',21) EXCEPT (SELECT * FROM test WHERE name='Jose');

entonces el SELECT se ejecuta primero y te traerá los registros enteros (con todas sus columnas, incluído el id) cuyo name = 'Jose', luego el INSERT ingresará a la tabla el registro a menos que coincida exactamente con alguno de los registros que trajo el SELECT.

Citar
El nombre no es único, es único el nombre mas el numero a la vez, es decir pueden existir campos así: (1,'Jose',21) (2,'Jose',23) pero no (1,'Jose',21) (2,'Jose',21)

¿Qué tal un índice UNIQUE sobre las 2 columnas (name y number)?


Título: Re: SQLite3 INSERT INTO + EXCEPT
Publicado por: patilanz en 5 Octubre 2015, 21:11 pm
Gracias por sus respuesta pero lo hice así:

Código
  1. INSERT INTO test (name,NUMBER) VALUES('Jose',21) EXCEPT SELECT name,NUMBER FROM test WHERE name='Jose' AND NUMBER=21

La table tiene ID pero no lo selecciono y se inserta solo