У вас есть проблема в том, что простой триггер окажется неэффективным при вставке из-за того, что вы говорите, что они перейдут из «book» в «book-1», «book-2» и т. Д. Самый простой способ сделатьэто будет иметь новый столбец, который содержит числовое значение по умолчанию 0. Это может быть сделано в хранимой процедуре, т.е.
CREATE PROCEDURE `insertURL`(inURL VARCHAR(255))
BEGIN
DECLARE thisSuffix INT UNSIGNED DEFAULT 0;
// We have to get this ID first, as MySQL won't let you select from the table you are inserting to
SELECT COALESCE(MAX(url_suffix)+1,0) INTO thisSuffix FROM urls WHERE url_column = inURL;
// Now the ID is retrieved, insert
INSERT INTO urls (
url_column,
url_suffix
) VALUES (
inURL,
thisSuffix
);
// And then select the generated URL
SELECT IF(thisSuffix>0,CONCAT(inURL,'-',thisSuffix),inURL) AS outURL;
END
, которая затем вызывается с использованием
CALL insertURL('book');
Изатем вернет 'book', если суффикс = 0, или 'book-1', если он имеет суффикс больше 0.
В целях тестирования мой дизайн таблицы был
CREATE TABLE `urls` (
`url_column` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`url_suffix` tinyint(3) UNSIGNED NOT NULL ,
PRIMARY KEY (`url_column`, `url_suffix`)
);