Michael Scharf <[EMAIL PROTECTED]> writes:
> Jim C. Nasby wrote:
>> On Thu, Jan 05, 2006 at 01:39:02PM -0600, Kurt Welgehausen wrote:
>>
>>> create trigger EnumTrg before insert on MainTbl for each row
>>> when (select count(*) from EnumVals where val = new.EnumCol) = 0 begin
>>> select raise(rollback, 'foreign-key violation: MainTbl.EnumCol');
>>> end;
>> Wouldn't that be a lot more efficient with some kind of EXISTS test
>> rather than a count(*)?
>
> No. Because the count is at most 1 and therefore its cheaper than as exists,
> because no additional nested query is needed.
>
> However if the count(*) would be big EXISTS or LIMIT would make sense:
> select count(*) where EXISTS (select * from TABLE where ...)
> or
> select count(*) from (select * from TABLE where ... LIMIT 1)
>
> Michael
If you have many enum values, for slightly better efficiency (since all rows
need not be scanned), you should be able to do something like this:
CREATE TRIGGER EnumTrg
BEFORE INSERT ON MainTbl
FOR EACH ROW
WHEN (SELECT 1
FROM EnumVals
WHERE val = new.EnumCol
LIMIT 1) IS NULL
BEGIN
SELECT raise(rollback, 'forign-key violation: MainTbl.EnumCol');
END;
Derrell