Tried it and found a <potential> issue with update, though it might actually 
work the way he wants. Good call though, I keep forgetting the on conflict 
thing can be on table creation and not just for a query.

--continuing from your script...

sqlite> select * from demo;
--EQP-- 0,0,0,SCAN TABLE demo
id|k|otherstuff
1|10|One-Mississippi
2|40|Four-Mississippi
3|30|Three-Mississippi

sqlite> update demo set id = 1 where k = 30;
--EQP-- 0,0,0,SEARCH TABLE demo USING INDEX sqlite_autoindex_demo_1 (k=?)

sqlite> select * from demo;
--EQP-- 0,0,0,SCAN TABLE demo
id|k|otherstuff
1|30|Three-Mississippi
2|40|Four-Mississippi

sqlite> update demo set k = 40 where id = 1;
--EQP-- 0,0,0,SEARCH TABLE demo USING INTEGER PRIMARY KEY (rowid=?)
Error: UNIQUE constraint failed: demo.k

sqlite> update demo set id = 1, k = 30 where id = 2;
--EQP-- 0,0,0,SEARCH TABLE demo USING INTEGER PRIMARY KEY (rowid=?)

sqlite> select * from demo;
--EQP-- 0,0,0,SCAN TABLE demo
id|k|otherstuff
1|30|Four-Mississippi

sqlite>

-----Original Message-----
From: sqlite-users [mailto:sqlite-users-boun...@mailinglists.sqlite.org] On 
Behalf Of R Smith
Sent: Friday, August 18, 2017 12:18 PM
To: sqlite-users@mailinglists.sqlite.org
Subject: Re: [sqlite] Enforcing uniqueness from multiple indexes



On 2017/08/18 6:08 PM, R Smith wrote:
>
> Isn't this what conflict clauses on constraints are for?
>

Apologies, I usually add the test-case scripts in case anyone else wish 
to test it or similar, the case in question herewith added below:

   -- SQLite version 3.17.0  [ Release: 2017-02-13 ]  on SQLitespeed 
version 2.0.2.4.
   -- Script Items: 7          Parameter Count: 0
   -- 
================================================================================================

CREATE TABLE demo(
   id INTEGER PRIMARY KEY ON CONFLICT REPLACE,
   k TEXT UNIQUE ON CONFLICT ABORT,
   otherstuff ANY
);

INSERT INTO demo VALUES
(1,10,'One-Mississippi'),
(2,20,'Two-Mississippi'),
(3,30,'Three-Mississippi')
;

   -- This one works as expected, replacing the previous key.
INSERT INTO demo VALUES (2,40,'Four-Mississippi');

SELECT * FROM demo;
   --      id      |  k  | otherstuff
   -- ------------ | --- | -----------------
   --       1      |  10 | One-Mississippi
   --       2      |  40 | Four-Mississippi
   --       3      |  30 | Three-Mississippi

   -- This one should fail since the id is new but k conflicts...
INSERT INTO demo VALUES (5,40,'Four-Mississippi-Again');
   -- and does:

   -- 2017-08-18 18:14:20.463  |  [ERROR]      UNIQUE constraint failed: 
demo.k
   --   Script Stats: Total Script Execution Time:     0d 00h 00m and 
00.025s
   --                 Total Script Query Time:         0d 00h 00m and 
00.004s
   --                 Total Database Rows Changed:     4
   --                 Total Virtual-Machine Steps:     167
   --                 Last executed Item Index:        5
   --                 Last Script Error: Script Failed in Item 4: UNIQUE 
constraint failed: demo.k
   -- 
------------------------------------------------------------------------------------------------

   -- 2017-08-18 18:14:20.465  |  [Info]       Script failed - Rolling 
back...
   -- 2017-08-18 18:14:20.466  |  [Success]    Transaction Rolled back.
   -- 2017-08-18 18:14:20.466  |  [ERROR]      Failed to complete: 
Script Failed in Item 4: UNIQUE constraint failed: demo.k
   -- 
================================================================================================

_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to