On Sun, Jun 18, 2006 at 01:16:35AM -0400, C.Peachment wrote:
> On Sun, 18 Jun 2006 00:23:58 -0400, David D Speck wrote:
> >What would the most elegant way be to insert a name and address entry
> >into the main table ONLY if it is not already there? I could see doing
> >a SELECT WHERE lname = new_lname AND fname = new_fname, AND street =
> >new_street, etc, and then aborting the INSERT if the SELECT returns a
> >match.
>
> >I just wondered if there was a neater way to accomplish this?
>
> You could declare each column in the table to be UNIQUE and let the
> database report each duplicate. For example:
>
> SQLite version 3.3.6
> Enter ".help" for instructions
> sqlite>create table test (
> ...>lname varchar(60) unique,
> ...>fname varchar(60) unique,
> ...>street varchar(60) unique);
> sqlite>insert into test values ('a', 'b', 'c');
> sqlite>insert into test values ('a', 'b', 'c');
> SQL error: column street is not unique
> sqlite>
>
> In a program, you might want to catch the error and report it.
I have a related question. Suppose I have a table containing rows each with
values and a counter. If the new row is unique in the table it should be
INSERTed and the counter set to 1; otherwise the counter for the matching
row should be incremented. It's a classic data reduction procedure.
As most of the operations will be UPDATEs I want to do something like
UPDATE ... if failed INSERT...
but I can't see an efficient way to express that in SQL understood by
sqlite.
Thanks,