MySQL插入行,在副本上:添加后缀并重新插入


MySQL Insert row, on duplicate: add suffix and re-insert

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

简而言之,我想插入一行slug(带有alpha和破折号的短字符串: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存在,则插入this-is-a-slug-1,否则插入this-is-a-slug

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

这就是问题所在,希望大家都能提点意见。

注::这是在一个真正沉重的RSS新闻更新过程中使用的,在这个过程中,我可以很容易地用php检查数据库中的段塞,然后修改它,但这会使我的脚本时间加倍:|,所以我想我可以让mysql而不是php更难。

您可以创建一个触发器来更改NEW的值。插入前先弹射。

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)