SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.09.2013 17:35:56

skolozhabskiy
Участник
Зарегистрирован: 14.08.2011
Сообщений: 24

MySql триггер для sku.

добрый день,

есть таблица `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. как будет вести себя триггер если в дальнейшем обновлять отдельные поля внесенных в таблицу продуктов?
  а. мешать обновлению?
  б. никак не влиять на дальнейшие обновления?

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

Неактивен

 

#2 04.09.2013 21:55:05

skolozhabskiy
Участник
Зарегистрирован: 14.08.2011
Сообщений: 24

Re: MySql триггер для sku.

насколько верно такое решение:

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

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

BEGIN
UPDATE `products` SET
`sku` = concat_ws('', REPEAT('0', 7 - LENGTH(NEW.`id`)), NEW.`id`)
WHERE `id` = NEW.`id`
END

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

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

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

Неактивен

 

#3 04.09.2013 23:02:17

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: MySql триггер для sku.

А почему просто не определить id как int(7) unsigned zerofill ?

Неактивен

 

#4 04.09.2013 23:11:04

skolozhabskiy
Участник
Зарегистрирован: 14.08.2011
Сообщений: 24

Re: MySql триггер для sku.

так в таблице поле `sku` и определено как int(7) unsigned zerofill DEFAULT NULL.
проблема в том, что занести в поле `sku` значение поля `id` можно только после INSERT новой записи.

тогда нужно как-то объединить вначале INSERT и UPDATE в одной транзакции.

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

спасибо

Неактивен

 

#5 04.09.2013 23:41:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: MySql триггер для sku.

зачем вам вообще поле sku, если оно дублирует id?
определите id как int(7) unsigned zerofill.

Неактивен

 

#6 05.09.2013 11:58:53

skolozhabskiy
Участник
Зарегистрирован: 14.08.2011
Сообщений: 24

Re: MySql триггер для sku.

спасибо за дискуссию, наверное самое лучшее решение удалить дублирующее поле `sku` вообще из таблицы, а в скриптах создавать sku так:

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

так будет самое оптимальное решение?

спасибо

Неактивен

 

#7 05.09.2013 12:30:11

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: MySql триггер для sku.

Да, а ещё проще определить id как int(7) unsigned zerofill.

Судя по написанному выше, вы неправильно понимаете значение атрибута zerofill.
Для иллюстрации выполните следующий код:

CREATE TABLE test_table(a INT(11),b INT(11) zerofill);
INSERT INTO test_table VALUES(1,1);
SELECT * FROM test_table;

Неактивен

 

#8 05.09.2013 14:16:28

skolozhabskiy
Участник
Зарегистрирован: 14.08.2011
Сообщений: 24

Re: MySql триггер для sku.

спасибо, разобрался

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson