ferrybig

Postgres with example

Oct 6th, 2025
1,478
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- drop table file, folder;
  2.  
  3. CREATE TABLE "folder" (
  4.     "id" INT PRIMARY key GENERATED ALWAYS AS IDENTITY,
  5.     "name" VARCHAR NOT NULL,
  6.     "parent_id" INTEGER REFERENCES "folder"("id")--,
  7.     --constraint folder_name UNIQUE NULLS NOT DISTINCT (name, parent_id)
  8. );
  9.  
  10. CREATE TABLE "file" (
  11.     "id" INT PRIMARY key GENERATED ALWAYS AS IDENTITY,
  12.     "name" VARCHAR NOT NULL,
  13.     "parent_id" INTEGER REFERENCES "folder"("id"),
  14.     "contents" TEXT--,
  15.     --constraint folder_name UNIQUE NULLS NOT DISTINCT (name, parent_id)
  16. );
  17.  
  18. insert into folder (name, parent_id) values
  19. ('dir1', null),
  20. ('dir2', null),
  21. ('dir3', null),
  22. ('dir4', null);
  23.  
  24.  
  25.  
  26. insert into folder (name, parent_id)
  27. select t.name, folder.id
  28. from (values
  29. ('subdir1'),
  30. ('subdir2'),
  31. ('subdir3'),
  32. ('subdir4')
  33. ) AS t (name)
  34. inner join folder on true;
  35.  
  36.  
  37. insert into folder (name, parent_id)
  38. select t.name, folder.parent_id
  39. from (values
  40. ('subsubdir1'),
  41. ('subsubdir2'),
  42. ('subsubdir3'),
  43. ('subsubdir4')
  44. ) AS t (name)
  45. inner join folder on folder.parent_id is not null;
  46.  
  47. insert into file(name, parent_id, contents)
  48. select t.name, folder.id, ''
  49. from (values
  50. ('file1.txt'),
  51. ('t.test')
  52. ) AS t (name)
  53. inner join folder on true;
  54.  
  55. insert into file(name, parent_id, contents)
  56. values ('root.txt', null, '');
  57.  
  58. update file
  59. set name = id || '-' || name;
  60.  
  61.  
  62. WITH RECURSIVE tree(id, parent_id, name) AS (
  63.     select id, parent_id, array[name] from folder
  64.   UNION ALL
  65.     SELECT tree.id, folder.parent_id, folder.name || tree.name
  66.     from tree
  67.     inner join folder on folder.id = tree.parent_id
  68. )
  69. select
  70. file.id,
  71. coalesce(array_to_string(tree.name || file.name, '/'), file.name) as path
  72. from file
  73. left join tree on tree.parent_id is null and tree.id = file.parent_id
  74. order by 2
  75.  
Advertisement
Add Comment
Please, Sign In to add comment