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

时间:2011-11-21 22:20:52

标签: 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');

如果this-is-a-slug-1存在,则应插入this-is-a-slug,否则应插入this-is-a-slug

然而,预计会产生错误,告诉我在FROM声明中我不能发表UPDATE声明,或类似的声明。

这就是问题,希望任何人都可以说些什么。

PS:这是在一个真正的升级RSS新闻更新程序中使用,我可以使用php轻松检查数据库中的slug然后修改它,但是这会使我的脚本时间加倍:|,所以我想我可以让mysql变得困难而不是php。

1 个答案:

答案 0 :(得分:9)

您可以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)