0

cc_playlist给定一个有 4 行/记录的表,其中id_key主键是自动递增的,and track_idtrack_positionand playlist_id

+--------+----------+----------------+-------------+
| id_key | track_id | track_position | playlist_id |
+--------+----------+----------------+-------------+
|     23 |        3 |              0 |           1 |
|    223 |       23 |              1 |           1 |
|    343 |       45 |              2 |           1 |
|    344 |       32 |              3 |           1 |
+--------+----------+----------------+-------------+ 

问题:
当我想添加一条新记录时,例如track_id = 777, track_position=2playlist_id =1我希望它放置新记录并将其余记录向下推,只要它在同一个playlist_id.

    +--------+----------+----------------+------------ -+
    | id_key | track_id | 轨道位置 | 播放列表 ID |
    +--------+----------+----------------+------------ -+
    | 23 | 3 | 0 | 1 |
    | 223 | 23 | 1 | 1 |
 -->| 345 | 第777章 2 | 1 |
    | 第343章 45 | 3 | 1 |
    | 第344章 32 | 4 | 1 |
    +--------+----------+----------------+------------ -+

注意:我在 php 中执行此操作,如果在 Postgres 中无法执行。

4

2 回答 2

0

我认为您想要的是在插入新记录之前这样的查询:

update cc_playlist
    set track_position = track_position + 1
    where playlist_id = YOURPLAYLISTID and track_position > YOURTRACKPOSITION;

delete请注意,当您删除轨道时,您需要对 执行类似的操作。

此外,您可以将其设置为数据库中的更新触发器,以便数据库自动执行此操作。或者,将插入包装在存储过程中,并在那里进行插入和更新。

于 2013-03-31T15:25:38.707 回答
0

在我看来,您应该在查询表时插入具有适当track_position的新行并按 track_position排序(请耐心等待)。

原因是因为 PostgreSQL 将表存储为无序堆。这意味着每次您在表上插入一行时,它都会附加(即,插入到末尾)到包含表内容的文件中。

有一种方法可以根据索引(postgresql cluster)重新组织表。如果您想将其用于测试目的,我会将其包括在内,但我完全建议您不要这样做。话虽如此,您将使用playlist_id、track_id作为索引键在表上创建索引,然后使用 cluster 命令。

我也认为在 php 中这样做是一个坏主意,因为这种行为 clearle 属于 PostgreSQL。

我知道这不是您问题的实际答案,但也许有帮助

总结一下:

  • 查询时只需插入行和顺序
  • 在 PostgreSQL 中执行此操作,而不是在 php 中
  • 不要使用集群
于 2013-03-31T15:58:56.153 回答