MySQL插入行,重复:添加后缀并重新插入

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以其他方式插入.

然而,预计会产生一个错误,告诉我,我不能FROMUPDATE声明或类似的声明中发表声明.

这就是问题,希望任何人都能说些什么.

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)