[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: MySql триггер для sku.
skolozhabskiy
добрый день,

есть таблица `products` с полем `id` (AUTO_INCREMENT) и полем `sku` (`sku` int(7) unsigned zerofill DEFAULT NULL), которое имеет вид типа 0000001, 0000002 и так далее, где цифра после нулей соответствует `id`. `sku`- это внутренний код магазина. конечно есть возможность программно создавать этот код примерно так:

$sku = sprintf('%07d', $row['id']);, но не проще ли создать триггер для поля `sku` таблицы `products`, который бы автоматически на INSERT продукта создавал бы нужное форматирование от поля `id`?

если создать триггер, то мои рассуждения таковы:

1. открыл таблицу `products`
2. открыл вкладку Триггеры
3. Добавить триггер -> открылась форма, заполнить поля

название - added_sku
таблица - products
время - BEFORE
событие - INSERT
определение : root@localhost (устанавливается при пустом поле автоматически)

BEGIN
?????????????????????????????
END

определитель - оставить пустым

4. нажать кнопку OK

вопрос :
1. как правильно создать триггер (каков будет сам код триггера) для поля `sku` таблицы `products`?
2. как будет вести себя триггер если в дальнейшем обновлять отдельные поля внесенных в таблицу продуктов?
а. мешать обновлению?
б. никак не влиять на дальнейшие обновления?

спасибо за помощь
vagrand
skolozhabskiy

Хмм интересная небольшая задачка по генерации такого представления числа в MySQL, у меня вышло вот так:


update products set
sku = concat_ws('', REPEAT('0', 7 - LENGTH(NEW.id)), NEW.id)
where id = NEW.id


Может у каого получится более изящный спомоб, интересно было бы глянуть

_____________
Senior PHP developer: PHP5, MySQL, JavaScript, CakePHP, Yii/Yii2, Zend Framework, Smarty, XML/Xslt, JQuery, Jquery Mobile, Bootstrap, ExtJS, HTML, HTML5, CSS, Linux, SVN, Git, Memcached, Redis, MongoDB, Zend Guard, Ioncube, FFMpeg, PayPal, Webmoney, Qiwi, Facebook API, Vkontakte Api, Google API, Twitter Api, Steam Api.
Junior Android Developer: Android SDK, многопоточность, работа с HTTP запросами, JSON, SQLite, фрагменты.
skolozhabskiy
спасибо за решение,

а что вы имеете в виду более изящный метод?

и еще вероятно у меня ошибка - в форме триггера нужно писать так:

название - added_sku
таблица - products
время - AFTER // вместо BEFORE
событие - INSERT
определение : root@localhost (устанавливается при пустом поле автоматически)

BEGIN
update products set
sku = concat_ws('', REPEAT('0', 7 - LENGTH(NEW.id)), NEW.id)
where id = NEW.id
END

определитель - оставить пустым

так верно?

спасибо
S.Chushkin
vagrand
Изящнее LPAD() вместо CONCAT().

skolozhabskiy
если создать триггер...
По правильному, в Вашем случае не нужно использовать триггер. Нужно использовать два запроса - добавить, затем изменить. В одной транзакции, конечно.
Дело в том, что в триггере нельзя изменять туже самую таблицу. И нельзя получить гарантированно корректный ID перед вставкой строки.
п.с. Конечно можно самому генерить ИД, используя last_insert_id(), но это не правильно и в один прекрасный момент может не сработать.

upd
Ещё: поле sku не может быть integer, у числового поля нет ведущих нулей.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
skolozhabskiy
// Нужно использовать два запроса - добавить, затем изменить. В одной транзакции, конечно.

а можно простой пример такого запроса применительно к моей задаче.

спасибо
S.Chushkin
Последовательность что-то вроде...
start transaction;
insert into products...;
(rollback, если ошибка)
update products set sku = lpad(id,7,'0') where id = last_insert_id();
(rollback, если ошибка)
commit;

п.с. Надеюсь, в коде PHP сами напишите.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
skolozhabskiy
вы имеете в виду нечто подобное :

$query = "INSERT INTO mytable (`columnname1`, `columnname2`) VALUES('$value1', '$value2') ON DUPLICATE KEY UPDATE `sku`=.........";

спасибо
S.Chushkin
Я имею в виду то, что написал. Не надо выдумывать.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
killer8080
Цитата (skolozhabskiy @ 4.09.2013 - 16:38)
есть таблица `products` с полем `id` (AUTO_INCREMENT) и полем `sku` (`sku` int(7) unsigned zerofill DEFAULT NULL), которое имеет вид типа 0000001, 0000002 и так далее, где цифра после нулей соответствует `id`. `sku`- это внутренний код магазина. конечно есть возможность программно создавать этот код примерно так:

$sku = sprintf('%07d', $row['id']);, но не проще ли создать триггер для поля `sku` таблицы `products`, который бы автоматически на INSERT продукта создавал бы нужное форматирование от поля `id`?

а никого не смутило, что у него в поле sku дублируется поле id? И все дружно подхватили идею с триггерами. blink.gif
skolozhabskiy
выкиньте поле sku, и не изобретайте себе проблем smile.gif
skolozhabskiy
доброе утро,

вы считает, что для `sku` использовать просто поле `id` это самое оптимальное решение?

тогда программно просто создавать `sku` так:

$sku = sprintf('%07d', $row['id']);

а в таблице поле `sku` удалить.

спасибо.
killer8080
Цитата (skolozhabskiy @ 5.09.2013 - 10:53)
вы считает, что для `sku` использовать просто поле `id` это самое оптимальное решение?

это единственное правильное решение
Цитата (skolozhabskiy @ 5.09.2013 - 10:53)
тогда программно просто создавать `sku` так:

$sku = sprintf('%07d', $row['id']);

можно так, можно на стороне сервера
SELECT LPAD(`id`, 7, '0') `sku` ..

можно сделать поле id int(7) zerofill, если уж нужно в таком виде выводить.
skolozhabskiy
спасибо, я понял
S.Chushkin
Цитата (killer8080 @ 5.09.2013 - 11:25)
а никого не смутило, что у него в поле sku дублируется поле id? И все дружно подхватили идею с триггерами. blink.gif

Цитата: "`sku`- это внутренний код магазина."
То, что он вначале соответствует ИД, частный случай.

_____________
Рекламка / ad.pesow.com Хрень / mr-1.ru
killer8080
Цитата (S.Chushkin @ 5.09.2013 - 14:54)
То, что он вначале соответствует ИД, частный случай.

с чего бы это? Под частный случай, триггеры никто делать не будет.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.