2019-02-23 10:03 GMT+01:00, Rocky Ji:
> I went from
>
> https://sqlite.org/lang_createtable.html
>
> to
>
> https://sqlite.org/syntax/table-constraint.html
>
> to
>
> https://sqlite.org/syntax/expr.html
>
> and figured expr of `check` in table constraint may contain a nested select
> after `not in`.

These diagrams describe the general syntax recognized by the parser
but a parsable statement can still be rejected at a later compilation
step.



>
> On Sat, Feb 23, 2019, 1:24 PM Clemens Ladisch wrote:
>
>> Rocky Ji wrote:
>> > CREATE TABLE Aliases (
>> >   alias_id INTEGER PRIMARY KEY AUTOINCREMENT,
>> >   real_name TEXT NOT NULL,
>> >   aka TEXT NOT NULL,
>> >   CONSTRAINT xyz UNIQUE (real_name, aka),
>> >   CONSTRAINT noCircularRef_A CHECK (
>> >     real_name NOT IN (SELECT aka FROM Aliases)
>> >   ),
>> >   CONSTRAINT noCircularRef_B CHECK (
>> >     aka NOT IN (SELECT real_name FROM Aliases)
>> >   )
>> > );
>> >
>> > Error: no such table: Aliases
>>
>> <https://www.sqlite.org/lang_createtable.html#ckconst> says:
>> | The expression of a CHECK constraint may not contain a subquery.
>>
>> You'd have to write triggers to check this:
>>
>> CREATE TRIGGER noCircularRef_insert
>> AFTER INSERT ON Aliases
>> FOR EACH ROW
>> WHEN NEW.real_name IN (SELECT aka FROM Aliases)
>>   OR NEW.aka IN (SELECT real_name FROM Aliases)
>> BEGIN
>>   SELECT RAISE(FAIL, "circular reference");
>> END;
>> -- same for AFTER UPDATE OF real_name, aka
>>
>>
>> Regards,
>> Clemens
>> _______________________________________________
>> sqlite-users mailing list
>> [email protected]
>> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>>
> _______________________________________________
> sqlite-users mailing list
> [email protected]
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to