Re: How can I do this?

Поиск
Список
Период
Сортировка
От Alan Young
Тема Re: How can I do this?
Дата
Msg-id 014001c06b9c$d73ad080$d44f58cf@idiglobal.com
обсуждение исходный текст
Ответ на Re: How can I do this?  (Joel Burton <jburton@scw.org>)
Список pgsql-novice
> You can use a trigger, but not w/syntax like this. REFERENCES... ON
> DELETE... only allows you to to do regular referential integrity stuff
> (set the field to null, block deletions, etc.), not look up a better value
> and put it there.
>
> You want to create a trigger with something like:
>
> CREATE TRIGGER foo BEFORE DELETE ON category FOR EACH ROW EXECUTE
> PROCEDURE foo();

So the parentid would then just be

parentid int references category ( catid ),

?

> Your function foo() can dig the new value you want out and update this for
> all the related records.

I'm still not clear on how I would get the appropriate data into the
function.

CREATE FUNCTION updatecat ( ??? )
RETURNS int
AS 'A = select parentid from category where catid=<catid to be
deleted--where does this come from?>;
update category set parentid=A where parentid=<catid to be deleted>;'
LANGUAGE 'sql';

How do I get the appropriate info into the query?  Also, I'm fairly certain
I can do that select/update as a subselect but I'm not sure how to go about
doing that.  I'm new to subqueries as well.

> Can you explain what it is that you want to do? It sounds like you're
> building a tree here, and there might be a better strategy overall than
> the one you're starting with.

I want to have a category table that supports sub categories.  Easy enough,
the table I defined in my original post works just fine for that.  But what
I want to happen is that a subcategory will be reassigned automagically to
it's parent category's parent category upon deletion of the parent category.
Ummm ... I'm not sure how to say that any better.

For example, I have the following categorys

catid | parentid | catname | catdesc
========================
0      |                | TOP      | Top level category
1      | 0             | cat1       | cat one
2      | 1             | cat1.1    | cat one:one
3      | 2             | cat1.1.1 | cat one:two:three

delete from category where catid=2;

I want the following to happen automagically.

catid | parentid | catname | catdesc
========================
0      |                | TOP      | Top level category
1      | 0             | cat1       | cat one
3      | 1             | cat1.1.1 | cat one:two

Does that make more sense?

Alan Young
Programmer/Analyst
IDIGlobal.com



В списке pgsql-novice по дате отправления:

Предыдущее
От: Joel Burton
Дата:
Сообщение: Re: How can I do this?
Следующее
От: David Merrill
Дата:
Сообщение: error "11"