gpt4 book ai didi

php - MySQL 插入行,重复 : add suffix and re-insert

转载 作者:可可西里 更新时间:2023-11-01 07:19:06 25 4
gpt4 key购买 nike

我的问题比较复杂,但我想我应该试一试。

简而言之,我想插入一行带有 slug(带有字母和破折号的短字符串:this-is-a-slug)。问题是 slug 是一个唯一的键,可能有重复项。

当存在重复项时,应该使用修改后的 slug 插入,例如带有后缀:this-is-a-slug-1,如果失败则增加后缀:this-is- a-slug-2。

这是棘手的部分,它应该在 MySQL 中完成(不涉及 PHP)并且最好在 INSERT 语句中完成(没有变量、过程等)

我试过这样一个简单的解决方案:

INSERT INTO table (slug) VALUES(IF((SELECT COUNT(slug) FROM table WHERE slug = 'this-is-a-slug') > 0, 'this-is-a-slug-1', 'this-is-a-slug');

这应该插入 this-is-a-slug-1 如果 this-is-a-slug 存在,或者 this-is-a-slug 否则。

然而,这会产生一个错误,告诉我我不能在 UPDATE 语句中使用 FROM 语句,或类似的东西。

就是这个问题,希望大家能说说。

P.S.: 这被用在一个非常繁重的 RSS 新闻更新过程中,我可以很容易地用 php 检查数据库中的 slug 然后修改它,但这会使我的脚本时间加倍:|,所以我想我可以让 mysql 而不是 php 变得困难。

最佳答案

你可以 create a trigger在插入之前更改 NEW.slug 的值。

drop trigger if exists changeSlug;

delimiter |

CREATE TRIGGER changeSlug BEFORE INSERT ON slugs
FOR EACH ROW BEGIN
declare original_slug varchar(255);
declare slug_counter int;
set original_slug = new.slug;
set slug_counter = 1;
while exists (select true from slugs where slug = new.slug) do
set new.slug = concat(original_slug, '-', slug_counter);
set slug_counter = slug_counter + 1;
end while;

END;
|
delimiter ;

这就是结果

mysql> insert into slugs values ("dude");
Query OK, 1 row affected (0.00 sec)

mysql> insert into slugs values ("dude");
Query OK, 1 row affected (0.00 sec)

mysql> insert into slugs values ("dude");
Query OK, 1 row affected (0.00 sec)

mysql> select * from slugs;
+--------+
| slug |
+--------+
| dude |
| dude-1 |
| dude-2 |
+--------+
3 rows in set (0.00 sec)

关于php - MySQL 插入行,重复 : add suffix and re-insert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8219340/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com