validar - Comprobación más rápida si existe fila en PostgreSQL
validar si existe un registro en sql java (7)
Tengo un montón de filas que necesito insertar en la tabla, pero estas inserciones siempre se hacen por lotes. Así que quiero comprobar si existe una sola fila del lote en la tabla porque entonces sé que se insertaron todas.
Por lo tanto, no es una verificación de clave principal, pero no debería importar demasiado. Me gustaría comprobar solo una fila, por lo que el count(*)
probablemente no sea bueno, así que supongo que es algo así.
Pero dado que soy bastante nuevo en PostgreSQL, prefiero preguntar a personas que lo saben.
Mi lote contiene filas con la siguiente estructura:
userid | rightid | remaining_count
Entonces, si la tabla contiene alguna fila con el userid
proporcionado, significa que todos están presentes allí.
¿Qué tal simplemente?
select 1 from tbl where userid = 123 limit 1;
donde 123
es el ID de usuario del lote que está a punto de insertar.
La consulta anterior devolverá un conjunto vacío o una sola fila, dependiendo de si hay registros con el ID de usuario proporcionado.
Si esto resulta demasiado lento, podría buscar crear un índice en tbl.userid
.
si existe una sola fila del lote en la tabla, en ese caso no tengo que insertar mis filas porque sé con certeza que todas fueron insertadas.
Para que esto siga siendo así incluso si su programa se interrumpe a mitad del proceso, le recomiendo que se asegure de administrar las transacciones de la base de datos de manera apropiada (es decir, que todo el lote se inserte en una sola transacción).
Regla de oro
select exists (seleccione true de xx donde xx) como "Does 1 + 1 suma hasta 2";
Si piensa en el rendimiento, puede usar "PERFORM" en una función como esta:
PERFORM 1 FROM skytf.test_2 WHERE id=i LIMIT 1;
IF FOUND THEN
RAISE NOTICE '' found record id=%'', i;
ELSE
RAISE NOTICE '' not found record id=%'', i;
END IF;
Use la palabra clave EXISTS para devolver VERDADERO / FALSO:
select exists(select 1 from contact where id=12)
INSERT INTO target( userid, rightid, count )
SELECT userid, rightid, count
FROM batch
WHERE NOT EXISTS (
SELECT * FROM target t2, batch b2
WHERE t2.userid = b2.userid
-- ... other keyfields ...
)
;
Por cierto: si quieres que todo el lote falle en caso de un duplicado, entonces (dada una restricción de clave primaria)
INSERT INTO target( userid, rightid, count )
SELECT userid, rightid, count
FROM batch
;
hará exactamente lo que quiera: o tiene éxito o falla.
SELECT 1 FROM user_right where userid = ? LIMIT 1
Si su conjunto de resultados contiene una fila, entonces no tiene que insertar. De lo contrario, inserte sus registros.
select true from tablename where condition limit 1;
Creo que esta es la consulta que postgres usa para verificar las claves externas.
En su caso, puede hacer esto de una vez también:
insert into yourtable select $userid, $rightid, $count where not (select true from yourtable where userid = $userid limit 1);