给定一个包含4行/记录的表cc_playlist
,其中id_key
是自动递增的主键,track_id
,track_position
和playlist_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 = 777
,track_position=2
,playlist_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中无法完成。
答案 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。
我知道这不是你问题的实际答案,但也许有帮助
总结: