簡體   English   中英

如何使用正則表達式完全匹配MySQL中的記錄?

[英]How do I exactly match a record in MySQL using regular expressions?

我正在制作一個新聞系統,該新聞系統使用獨特的子彈來識別文章。 創建新文章時,我需要確保唯一的子彈尚未使用。 因此,如果兩個文章具有完全相同的名稱,則它們將生成完全相同的段。 如果要使用,我想在子彈末尾附加一個數字。

像這樣:

  • 一些非常有趣的文章
  • 一些非常有趣的文章1
  • 一些真正有趣的文章2

等等。 因此,在我的測試用例中,我從數據庫中選擇與“某些有趣的文章”與0或多個“ -number”完全匹配的所有記錄。 因此,在這種情況下,我將返回3行,因此下一個提示將是“ some-really-interesting-article-3”。

除了我的正則表達式表現出異常(或可能很正常,我只是對正則表達式很爛)並且返回帶有部分匹配項的行外,此方法效果很好。 因此,如果我搜索“非常有趣”,那將會過去。

SELECT id, title, slug
FROM news 
WHERE slug RLIKE '([[:<:]]some-really-interesting-article[[:>:]][-\d]*)'

因此,正如我所說,如果我使用“確實有趣”運行上述正則表達式,它將返回所有3行。

請告訴我,我公然無知地做錯了。 謝謝。

嘗試

WHERE slug RLIKE '(^some-really-interesting-article(-[0-9]+)?$)'

那這個呢 ?

"^some-really-interesting-article(-[[:digit:]]+)?$"

希望這會工作:)

正如其他人已經指出的那樣,這將起作用:

SELECT id, title, slug FROM news
WHERE slug RLIKE '^some-really-interesting-article(-[0-9]+)?$'

但是,MySQL不夠聰明,無法通過RLIKE充分利用索引。 (如果在slug列上有一個索引,它可能會嘗試使用它,但是必須進行完整的索引掃描。)但是,事實證明,您可以使用冗余的LIKE條件來幫助MySQL更多地處理查詢。有效地,像這樣:

SELECT id, title, slug FROM news
WHERE slug LIKE 'some-really-interesting-article%'
  AND slug RLIKE '^some-really-interesting-article(-[0-9]+)?$'

LIKE查詢可能會匹配一些誤報,例如some-really-interesting-article-about-something-else-entirely ,但是RLIKE會清除它們。 當然,如果您不關心此類誤報,則可以完全省去RLIKE

當然,另一種可能性是在slug列上創建一個唯一索引(無論如何,您實際上都應該擁有該索引),然后繼續增加子彈並嘗試插入記錄,直到INSERT成功為止。 當然,這也意味着您應該檢查錯誤代碼和消息以查看失敗的原因。 (如果INSERT由於重復值而失敗,則錯誤代碼應為1062 ,並且錯誤消息應包含重復鍵的名稱。)

無論如何,如果您想使用查詢, 這里有一個SQLize鏈接 我在里面留下了一些評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM