从有或没有空格的文件中删除特定文本

时间:2015-05-02 23:36:08

标签: mysql

我有字段:

word1 word2 word3 word4 word5 word6

我可以添加新单词:
UPDATE mytable SET val=CONCAT(val, 'word7 ')

然后我可以删除任何单词:
UPDATE mytable SET val=REPLACE(val, 'word1 ', '')

但是直到有人通过phpmyadmin手动编辑字段才行。因为它们在字段的末尾插入没有空格的单词,并且我的程序无法删除最后一个单词,因为它没有前导空格。我怎么能摆脱这个?

1 个答案:

答案 0 :(得分:2)

一种快速(和懒惰)的方法是将删除分为两个步骤:

  1. UPDATE mytable SET val = REPLACE(val, 'word1', '') WHERE val LIKE '%word1%'; - 在这里你只是摆脱了这个词,但留下了空格。无论单词是否具有尾随空格,这都将起作用。请注意仅触及包含此文本的行的WHERE条件(有时这种情况可以极大地提高查询性能;有时候它无关紧要;在这里我猜测它有好处)
  2. UPDATE mytable SET val = REPLACE(val, ' ', ' ') WHERE val LIKE '% %'; - 在这里你"崩溃"冗余空间,如果有的话。
  3. 按原样保留UPDATE查询。
  4. 更有远见的答案将是"你应该使用编程语言和/或框架来管理任何重要的MySQL数据;你为什么这么做?为什么任何人直接在PHPMyAdmin中编辑您的数据?"考虑到项目的限制,这可能是也可能不是有用的输入,但任何现代Web开发框架都将以更加结构化的方式强有力地支持管理数据库更新,从而消除了对此类大多数手动tomfoolery的需求。

    修改

    听起来你已经遇到了存储"标签的限制。通过这种方式。 (您的字段本身可能不是标签,但听起来您需要视为标签:每个字都是它自己的"单元"可以添加和删除

    简而言之,将它们存储在这样的长字符串中并不是理想的原因。您的选择可能有限,无法移动到其他结构。但是,如果您可以重新构建它,我会考虑创建一个包含三个字段的单独tags表:

    • id
    • attached_to_object_id(或user_id或其他;这是指向此标记添加到的父对象的外键),
    • name(此标记的实际文字,如word1)。

    要向对象添加标记,查询将类似于:

    INSERT INTO tags (user_id, name) VALUES ('<the parent object id>', 'word1');
    

    从对象中删除标记看起来像:

    DELETE FROM tags WHERE user_id = <parent object id> AND name = 'word1';
    

    如果您无法更改存储格式,我肯定会对标记的分隔方式施加更多结构化规则。具体来说,我强制规定,此字段中的任何添加/删除都必须遵循[TAG][SINGLE SPACE][repeat...]的模式。如果您不能指望其他用户维护此格式,那么您真的不应该让他们直接触摸数据库;你应该用另一种编程语言设置某种界面来调解所有的附加物和清除量。