0

我有一个 MySQL 表,其中包含属于公司和个人(客户)的电话号码。每个客户可以有多个电话号码,并且他们通常希望它们按特定顺序列出,因此该表有一个sequence字段可以根据每个客户的偏好对他们的电话号码进行排序。这些字段是:

  • parent_id- 字符
  • sequence- 微小的
  • area_code- 细绳
  • number- 细绳

主键是 和 的parent_id组合sequence

到目前为止,一切都很好。当我想按顺序向上移动一个数字或删除一个数字时,就会出现“问题”。

当向上移动一个数字时,我这样做的方式(使用 PHP)是将该记录更改sequence为 0(客户的第一个电话号码通常为 1,我为此使用 0),然后将前面的数字增加sequence1,然后设置原来的记录sequence比原来少1。换句话说,sequence与前面的电话号码交换,但需要三个查询。

删除电话号码时,我删除了该记录,然后我必须重新排序该客户剩余的电话号码,以免丢失sequence。这取决于客户有多少电话号码,但可以是多个查询。

我想知道是否有更有效的方法来做到这一点。

提前致谢!

4

2 回答 2

1

UPDATE可以同时影响多条记录;例如:

  1. 将序列 #4 移动到 #2:

    UPDATE my_table SET sequence = CASE
      WHEN sequence = 4 THEN 2
      WHEN sequence < 4 AND sequence >= 2 THEN sequence + 1
    END WHERE parent_id = ? AND sequence BETWEEN 2 AND 4;
    
  2. 删除序列#3

    DELETE FROM my_table WHERE parent_id = ? AND sequence = 3;
    
    UPDATE my_table
    SET    sequence = sequence - 1
    WHERE  parent_id = ? AND sequence > 3;
    

但是,如果以这种方式发生变化,您应该非常谨慎地使用(parent_id, sequence)作为您的 PK 。sequence定义一个完全合成的 PK 可能会更好。

于 2013-07-27T01:11:48.473 回答
1

如何删除这样的东西:

DELETE FROM phone_numbers WHERE parent_id = '{$parentID}' AND sequence = '{$seq}'

UPDATE phone_numbers SET sequence = sequence + 1 WHERE parent_id = '{$parentID}' AND sequence < '{$seq}'

于 2013-07-27T01:14:34.730 回答