Ton*_*nov 5 php mysql insert duplicates slug
我的问题相当复杂,但我想我应该试一试.
简而言之,我想插入一行slug(带有alphas和短划线的短字符串: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');
Run Code Online (Sandbox Code Playgroud)
this-is-a-slug-1如果this-is-a-slug存在,则应插入或this-is-a-slug以其他方式插入.
然而,预计会产生一个错误,告诉我,我不能FROM在UPDATE声明或类似的声明中发表声明.
这就是问题,希望任何人都能说些什么.
PS:这是在一个真正的升级RSS新闻更新程序中使用,我可以使用php轻松检查db中的slug然后修改它,但是这会使我的脚本的时间加倍:|,所以我想我可以制作它很难用于mysql而不是php.
And*_*and 10
您可以创建一个触发器,在插入之前更改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 ;
Run Code Online (Sandbox Code Playgroud)
这将是结果
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)
Run Code Online (Sandbox Code Playgroud)