alter table
This commit is contained in:
48
docker-entrypoint-initdb.d/5_nestedsets.sql
Normal file
48
docker-entrypoint-initdb.d/5_nestedsets.sql
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
ALTER TABLE famille
|
||||||
|
ADD lft int, rgt int;
|
||||||
|
|
||||||
|
-- fonction auxiliaire récursive : reçoit le compteur 'n', retourne le compteur mis à jour
|
||||||
|
CREATE OR REPLACE FUNCTION set_bounds(p_code INT, n INT)
|
||||||
|
RETURNS INT AS $$
|
||||||
|
DECLARE
|
||||||
|
child RECORD;
|
||||||
|
BEGIN
|
||||||
|
-- left
|
||||||
|
UPDATE famille SET lft = n WHERE code = p_code;
|
||||||
|
n := n + 1;
|
||||||
|
|
||||||
|
-- parcours des enfants
|
||||||
|
FOR child IN
|
||||||
|
SELECT code FROM famille WHERE code_parent = p_code ORDER BY code
|
||||||
|
LOOP
|
||||||
|
n := set_bounds(child.code, n);
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
-- right
|
||||||
|
UPDATE famille SET rgt = n WHERE code = p_code;
|
||||||
|
n := n + 1;
|
||||||
|
|
||||||
|
RETURN n;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
-- fonction principale : initialise et lance la reconstruction
|
||||||
|
CREATE OR REPLACE FUNCTION rebuild_nested_sets()
|
||||||
|
RETURNS VOID AS $$
|
||||||
|
DECLARE
|
||||||
|
root RECORD;
|
||||||
|
n INT := 1;
|
||||||
|
BEGIN
|
||||||
|
-- remise à zéro (optionnel)
|
||||||
|
UPDATE famille SET lft = NULL, rgt = NULL;
|
||||||
|
|
||||||
|
-- pour chaque racine
|
||||||
|
FOR root IN
|
||||||
|
SELECT code FROM famille WHERE code_parent IS NULL ORDER BY code
|
||||||
|
LOOP
|
||||||
|
n := set_bounds(root.code, n);
|
||||||
|
END LOOP;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
|
SELECT rebuild_nested_sets();
|
||||||
Reference in New Issue
Block a user