Divide the table into two tables: one that has a UNIQUE constraint for ValueA, and the other does not. Use view + triggers to join two tables. Sort of:
CREATE TABLE _Active ( ID INTEGER, ValueA VARCHAR(255) UNIQUE, ValueB INTEGER ); CREATE TABLE _Deleted ( ID INTEGER, ValueA VARCHAR(255), ValueB INTEGER ); CREATE VIEW Thingies AS SELECT ID, ValueA, ValueB, 0 AS Deleted FROM _Active UNION ALL SELECT ID, ValueA, ValueB, 1 AS Deleted FROM _Deleted; CREATE TRIGGER _trg_ii_Thingies_Active INSTEAD OF INSERT ON Thingies FOR EACH ROW WHEN NOT NEW.Deleted BEGIN INSERT INTO _Active(ID, ValueA, ValueB) VALUES (NEW.ID, NEW.ValueA, NEW.ValueB); END; CREATE TRIGGER _trg_ii_Thingies_Deleted INSTEAD OF INSERT ON Thingies FOR EACH ROW WHEN NEW.Deleted BEGIN INSERT INTO _Deleted(ID, ValueA, ValueB) VALUES (NEW.ID, NEW.ValueA, NEW.ValueB); END;
(I'm not sure about the syntax of CREATE TRIGGER, but you know what I mean.)
source share