我的问题相当复杂,但我想我应该试一试。
简而言之,我想插入一行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。答案 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)