PostgreSQL值增量

时间:2013-03-31 15:16:23

标签: php sql postgresql sql-order-by

给定一个包含4行/记录的表cc_playlist,其中id_key是自动递增的主键,track_idtrack_positionplaylist_id:< / p>

+--------+----------+----------------+-------------+
| 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 = 777track_position=2playlist_id =1,我希望它放置新记录并按下其余记录,只要它在同一个playlist_id。< / p>

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

注意:我在php中这样做,如果在Postgres中无法完成。

2 个答案:

答案 0 :(得分:0)

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

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

请注意,删除曲目时,您需要对delete执行类似操作。

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

答案 1 :(得分:0)

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

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

有一种方法可以根据索引(postgresql cluster)重新组织表。我包括这个,以防你想用它进行测试目的但我完全建议不要这样做。话虽这么说,您可以使用 playlist_id,track_id 作为索引键在表上创建索引,然后使用cluster命令。

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

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

总结:

  • 只需在查询时插入行和订单
  • 在PostgreSQL中执行此操作,而不是在php
  • 中执行此操作
  • 不要使用群集