On 2016/01/28 10:08 PM, R Smith wrote: > > > -- Insert Loop start: > -- This will simply fail if the PK already exists, else start the line > with 0 count. > INSERT OR IGNORE INTO element_attribute_values VALUES (:element, > :attribute, :value, 0); > > -- This might be faster since it uses only one lookup loop, but it > might also not be. > -- If you share a list of example data to be inserted, we can find a > faster way. Try it and let us know... > WITH EAV(id,icnt) AS ( > SELECT rowid,cnt+1 > FROM element_attribute_values > WHERE (element = :element) AND (attribute = :attribute) AND (value > = :value) > LIMIT 1 > ) > UPDATE element_attribute_values SET cnt = (SELECT icnt FROM EAV) > WHERE rowid = (SELECT id FROM EAV) > ; > -- Insert Loop end. >
Upon re-reading I realised my descriptions were confusing. To be clear, this is the entire loop SQL that should form part of your program: -- Insert Loop start: INSERT OR IGNORE INTO element_attribute_values VALUES (:element, :attribute, :value, 0); WITH EAV(id,icnt) AS ( SELECT rowid,cnt+1 FROM element_attribute_values WHERE (element = :element) AND (attribute = :attribute) AND (value = :value) LIMIT 1 ) UPDATE element_attribute_values SET cnt = (SELECT icnt FROM EAV) WHERE rowid = (SELECT id FROM EAV) ; -- Insert Loop end.