OK, I discovered the OR clause of the INSERT statement, so I'm trying: BEGIN TRANSACTION; INSERT OR ROLLBACK INTO db VALUES("This breaks a constraint"); COMMIT;
But now I get another error after the constraint violation : 'Error: cannot commit - no transaction is active' which gets back to the original point of this post, which is that SQLite is evidently not considering all text within 'BEGIN TRANSACTION; ... ; $EOT;' to be part of the same transaction (for $EOT in COMMIT, ROLLBACK, END TRANSACTION etc.) ; or if a transaction fails, it considers the next transaction to be part of the failed transaction (and so disallows another BEGIN TRANSACTION ). This seems very buggy to me. On 18/03/2015, Simon Slavin <slavins at bigfraud.org> wrote: > > On 18 Mar 2015, at 8:11pm, Jason Vas Dias <jason.vas.dias at gmail.com> wrote: > >> The problem is, if this transaction runs in a session, then >> NO transactions can ever run again in that session - eg. >> if I try to run the same transaction twice : >> On linux command line: >> $ echo ' >> BEGIN TRANSACTION; >> INSERT INTO db VALUES("This breaks a constraint"); >> COMMIT; >> BEGIN TRANSACTION; >> INSERT INTO db VALUES("This breaks a constraint"); >> COMMIT; >> ' | sqlite3 my_db_file.db >> Error: near line 1: UNIQUE constraint failed: db.some_field >> Error: near line 2: cannot start a transaction within a tranaction >> >> It is the second error that worries me, since it shows that the >> first failed transaction was not closed, even though I had clearly >> written "COMMIT;" at the end of it, and no transactions >> can ever run again in the same session. > > Which Unix/Linux command shell are you using ? I'm guessing that what > you're seeing makes no sense because of the way the sqlite3 is receiving the > lines from the shell. If I execute the commands singly I get this: > > 164:Desktop simon$ sqlite3 ~/Desktop/test.sdb > SQLite version 3.8.5 2014-08-15 22:37:57 > Enter ".help" for usage hints. > sqlite> CREATE TABLE myTable (myCol TEXT UNIQUE); > sqlite> INSERT INTO myTable VALUES ('This breaks a constraint.'); > sqlite> BEGIN; > sqlite> INSERT INTO myTable VALUES ('This breaks a constraint.'); > Error: UNIQUE constraint failed: myTable.myCol > sqlite> COMMIT; > sqlite> BEGIN; > sqlite> INSERT INTO myTable VALUES ('This breaks a constraint.'); > Error: UNIQUE constraint failed: myTable.myCol > sqlite> COMMIT; > sqlite> > > which is fine. If I then use your command in bash I get this: > > 164:Desktop simon$ echo ' >> BEGIN TRANSACTION; >> INSERT INTO myTable VALUES("This breaks a constraint."); >> COMMIT; >> BEGIN TRANSACTION; >> INSERT INTO myTable VALUES("This breaks a constraint."); >> COMMIT; >> ' | sqlite3 ~/Desktop/test.sdb > Error: near line 3: UNIQUE constraint failed: myTable.myCol > Error: near line 6: UNIQUE constraint failed: myTable.myCol > 164:Desktop simon$ > > which is again fine. > > Simon. > _______________________________________________ > sqlite-users mailing list > sqlite-users at mailinglists.sqlite.org > http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users >