[英]How do I exactly match a record in MySQL using regular expressions?
我正在制作一個新聞系統,該新聞系統使用獨特的子彈來識別文章。 創建新文章時,我需要確保唯一的子彈尚未使用。 因此,如果兩個文章具有完全相同的名稱,則它們將生成完全相同的段。 如果要使用,我想在子彈末尾附加一個數字。
像這樣:
等等。 因此,在我的測試用例中,我從數據庫中選擇與“某些有趣的文章”與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.