Joseph L. Casale wrote:
> CREATE TABLE t (
> id INTEGER NOT NULL,
> a VARCHAR NOT NULL COLLATE 'nocase',
> b VARCHAR COLLATE 'nocase',
> c VARCHAR CHECK (c IN ('foo', 'bar', NULL)) COLLATE 'nocase',
> PRIMARY KEY (id)
> );
>
> How does one elegantly construct an index or constraint such that for any
> row, column a may appear twice
You cannot look at other records without a subquery, which is not
allowed in CHECK constraints. You have to write a trigger instead.
And when you say "column a", do you actually mean "each distinct value
in column a"?
> ... with column c having a value of 'foo' and 'bar', unless this value
> for column a appears with a null value in column c where no other rows
> may now exist for that value of column a.
In other words, for each record, there must not exist any other record
with the same value in column a and a value in column c that is either
equal or NULL?
If I have decoded correctly what you were trying to say, use a trigger
like this, and duplicate it for UPDATE:
CREATE TRIGGER t_c_check_insert
AFTER INSERT ON r
FOR EACH ROW
BEGIN
SELECT RAISE(FAIL, '...')
FROM t
WHERE a = NEW.a
AND (c = NEW.c OR c IS NULL)
AND id <> NEW.id;
END;
Regards,
Clemens
___
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users