> It's theoretically possible, but in that case I would be content to > force a difference in the title. It should be possible to have the > following: > > 'History of Scotland' | -> 'A. Jones' > 'History of Scotland' | -> 'T. Smith' > 'Manual of DOS' | NULL > > But, an attempt to insert another record 'Manual of DOS' with a NULL > author should fail.
You can achieve this using a partial index[1] on the Books.title column, which is used only when the author is null. A test script to demonstrate: create table Books( id integer primary key, title text collate nocase not null, author references Authors(id), unique(title, author) ); create table Authors( id integer primary key, name text unique not null check(name <> '') ); -- ************************************************** create unique index no_author_index on Books(title) where author is null; -- ************************************************** insert into Authors values(1,'A. Jones'); insert into Authors values(2,'T. Smith'); insert into Books values(1, 'History of Scotland', 1); insert into Books values(2, 'History of Scotland', 2); insert into Books values(3, 'Manual of DOS', NULL); select b.title, a.name from Books b left join Authors a on a.id = b.author ; -- title name -- ------------------- ---------- -- History of Scotland A. Jones -- History of Scotland T. Smith -- Manual of DOS NULL insert into Books values(4, 'Manual of DOS', NULL); -- Error: near line 37: UNIQUE constraint failed: Books.title [1] https://www.sqlite.org/partialindex.html Mark -- Mark Lawrence