【问题标题】:PostgreSQL value incrementationPostgreSQL 值递增
【发布时间】:2013-03-31 15:16:23
【问题描述】:

给定一个表 cc_playlist 有 4 行/记录,其中 id_key 是自动递增的主键,track_idtrack_positionplaylist_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=2,playlist_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 中无法执行。

【问题讨论】:

  • 您能否澄清一下您所说的“将其余记录下推”是什么意思?其他记录似乎没有任何变化。
  • 但这有什么意义呢?您不能在查询中只使用ORDER BY track_position 吗?我问是因为自动增量的 AFAIK 很难或不可能做到。
  • 啊哈!在此处查看我的获奖答案:stackoverflow.com/a/14092775/905902
  • 有趣的解决方案,但是我无法向数据库添加新字段。
  • 我的直觉是,如果每行没有额外的状态变量,问题就无法解决。请证明我错了。

标签: php sql postgresql sql-order-by


【解决方案1】:

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

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

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

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

【讨论】:

  • 这正是我最终所做的,基本上在增量之后我做了插入,同样的事情反过来删除轨道。顺便说一句谢谢
【解决方案2】:

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

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

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

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

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

总结一下:

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

【讨论】:

  • 错字是什么?我看不出有什么区别。
  • :),我没有正确编号轨道位置(现在已修复)
  • 哦,我明白了。哇,好错别字哈哈。很高兴听到它已修复
猜你喜欢
  • 2017-03-22
  • 2021-10-31
  • 1970-01-01
  • 2020-04-02
  • 1970-01-01
  • 2012-08-28
  • 2023-02-01
  • 2017-11-28
相关资源
最近更新 更多