Autor
|
Tema: SQLite3 INSERT INTO + EXCEPT [SOLUCIONADO] (Leído 4,406 veces)
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Hola tengo una table: CREATE TABLE `test` ( `ID` INTEGER PRIMARY KEY AUTOINCREMENT, `name` TEXT NOT NULL, `number` INT NOT NULL ); INSERT INTO test VALUES(NULL,'Jose',21)
Que al ejecutar: 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: CREATE TABLE `test` ( `name` TEXT NOT NULL, `number` INT NOT NULL ); INSERT INTO test VALUES('Jose',21)
Al ejecutar: 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
|
|
« Última modificación: 5 Octubre 2015, 21:11 pm por patilanz »
|
En línea
|
|
|
|
Carloswaldo
Traductor
Moderador Global
Desconectado
Mensajes: 4.764
Nos reservamos el derecho de ban.
|
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?
|
|
|
En línea
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
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)
|
|
|
En línea
|
|
|
|
Carloswaldo
Traductor
Moderador Global
Desconectado
Mensajes: 4.764
Nos reservamos el derecho de ban.
|
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í: 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. 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)?
|
|
|
En línea
|
|
|
|
patilanz
Desconectado
Mensajes: 481
555-555-0199@example.com
|
Gracias por sus respuesta pero lo hice así: 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
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
SQLite3
Programación Visual Basic
|
cobein
|
3
|
3,646
|
13 Octubre 2009, 23:02 pm
por Karcrack
|
|
|
sqlite3
Wireless en Linux
|
Marmol
|
2
|
2,768
|
27 Junio 2010, 23:55 pm
por Marmol
|
|
|
[Solucionado] Problema con bulk insert
Bases de Datos
|
criskapunk
|
0
|
8,541
|
16 Junio 2011, 14:59 pm
por criskapunk
|
|
|
no bootable device insert boot disk and press any key "(SOLUCIONADO)"
Hardware
|
Charlieone
|
9
|
31,279
|
21 Marzo 2013, 14:43 pm
por Charlieone
|
|
|
[solucionado] mysqli rollback todos los insert si uno falla
PHP
|
gAb1
|
2
|
3,041
|
12 Abril 2016, 02:35 am
por gAb1
|
|