Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Добавление тригера "дата добавления" / 20 сообщений из 20, страница 1 из 1
01.05.2014, 10:07:32
    #38630797
Alexei772
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Здравствуйте
Таблица `steps`
Колонка `add` (datetime`) и колонка uid (varchar 255)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE IF NOT EXISTS `steps` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `add` datetime NOT NULL,
  `markdel` datetime DEFAULT NULL,
  `update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `uid` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid` (`uid`),
  KEY `name` (`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1256 AUTO_INCREMENT=3 ;



Триггер:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE TRIGGER `on_insert` AFTER INSERT ON `steps`
 FOR EACH ROW update `steps` 

set 
	 `steps`.`add`=NOW() 
        ,`steps`.`uid`=UUID() 

where `steps`.`id`=NEW.`id`



В результате при добавлении строки появляется ошибка: #1062 - Duplicate entry '' for key 'uid'

Подскажите почему такое происходит?
...
Рейтинг: 0 / 0
01.05.2014, 10:08:31
    #38630798
Alexei772
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Извиняюсь, скриншот прилепил случайно.
...
Рейтинг: 0 / 0
01.05.2014, 10:10:57
    #38630799
Alexei772
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Сообразил. Я убрал уникальный индекс на колонке uid.
Но другая проблема появилась: #1442 - Can't update table 'steps' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

Я первый раз имею дело с тригерами. Прошу помощи.
...
Рейтинг: 0 / 0
01.05.2014, 10:46:11
    #38630814
Alexei772
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Я понимаю что update можно делать только с таблицей не вызывающей тригер. Но как тогда иначе можно реализовать такую функцию?
...
Рейтинг: 0 / 0
01.05.2014, 22:28:30
    #38631116
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Хотел бы расширить вопрос о триггерах, адресуясь знатокам именно MySQL.

В MS SQL есть вычисляемые поля, отсутствующие в MySQL. Логичной аналогией было бы использование триггеров для вычисления расчетных полей на основании предоставленных пользователем "базовых" данных

Однако проблема возникает (практически в 99% случаев, ятд) при наличии автоинкрементного идентификатора.

Суть проблемы: в триггере AFTER INSERT запрещено изменять значения только что добавленных полей:
- нельзя писать set new.field = value
- нельзя выполнить update для обрабатываемой триггером таблицы

В то же время в триггере BEFORE INSERT эти операции (во всяком случае, set new.field=value) выполнить можно, но - автоидентификатор (в этот момент) еще не присвоен.

В частном случае я выкрутился с использованием буферной таблицы: по триггеру на INSERT для проблемной таблицы в буферную заносится необходимая в дальнейшем информация. Непосредственно после команды INSERT выполняется очистка буферной таблицы (delete from <буферная таблица>), в триггере AFTER DELETE которой выполняется требуемая изначально модификация данных проблемной таблицы.

После MS SQL такой подход кажется несколько... диковатым...
Может быть, вы сможете подсказать более тривиальное естественное решение?
...
Рейтинг: 0 / 0
04.05.2014, 17:39:04
    #38632464
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Cygapb-007В то же время в триггере BEFORE INSERT эти операции (во всяком случае, set new.field=value) выполнить можно, но - автоидентификатор (в этот момент) еще не присвоен.а зачем вам автоид в триггере? у вас значения полей на него завязаны, что ли?
...
Рейтинг: 0 / 0
04.05.2014, 18:41:40
    #38632520
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
tanglirCygapb-007В то же время в триггере BEFORE INSERT эти операции (во всяком случае, set new.field=value) выполнить можно, но - автоидентификатор (в этот момент) еще не присвоен.а зачем вам автоид в триггере? у вас значения полей на него завязаны, что ли?Угу, была такая задача, на деревьях в строке полный путь до корня, включая текущий id

Сейчас уже не актуально, но в принципе не понятно, как влёгкую выкрутиться
...
Рейтинг: 0 / 0
05.05.2014, 04:30:43
    #38632694
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Код: sql
1.
2.
3.
CREATE TABLE IF NOT EXISTS `steps` (

add TIMESTAMP DEFAULT CURRENT_TIMESTAMP
...
Рейтинг: 0 / 0
05.05.2014, 08:12:00
    #38632745
bochkov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
делайте 2 таблицы,
1 таблица содержит оригинальные данные,
2 таблица содержит pk из 1 ой таблицы, и вычисляемые(обновлямые) данные при событии триггера
...
Рейтинг: 0 / 0
05.05.2014, 11:39:13
    #38632969
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
bochkovделайте 2 таблицы,
1 таблица содержит оригинальные данные,
2 таблица содержит pk из 1 ой таблицы, и вычисляемые(обновлямые) данные при событии триггераЯсно, спасибо. Нельзя - так нельзя.

PS. Я сделал немного по-другому :
Код: sql
1.
2.
3.
4.
start transaction;
insert into MyTable <источник данных>; -- триггером AFTER INSERT необходимые поля копируются в MyTableBuff
delete from MyTableBuff; -- триггером AFTER DELETE обновляются автовычисляемые поля MyTable для добавленных данных
commit;
...
Рейтинг: 0 / 0
05.05.2014, 19:17:51
    #38633699
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Cygapb-007,

а в МС СКЛ можно для вычисляемых полей использовать автоинкрементное значение??? оно ведь вроде тоже не доступно ещо на момент вычисления вычисляемых значений...или мне память изменила?
...
Рейтинг: 0 / 0
06.05.2014, 09:42:04
    #38634128
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
alex564657498765453Cygapb-007,

а в МС СКЛ можно для вычисляемых полей использовать автоинкрементное значение??? оно ведь вроде тоже не доступно ещо на момент вычисления вычисляемых значений...или мне память изменила?там есть натуральные вычисляемые поля (в том числе и материализуемые, в т.ч. и индексируемые), так что проблемы как таковой нет.

триггеров instead of insert практически не писал, достаточно after insert, но могу попозже посмотреть, что там и как по части идентификаторов...
...
Рейтинг: 0 / 0
06.05.2014, 09:52:33
    #38634143
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
alex564657498765453Cygapb-007,

а в МС СКЛ можно для вычисляемых полей использовать автоинкрементное значение??? оно ведь вроде тоже не доступно ещо на момент вычисления вычисляемых значений...или мне память изменила?вот сходу пример про триггеры ms sql, вроде все видно с него...
http://sqlfiddle.com/#!6/d4395/1
...
Рейтинг: 0 / 0
06.05.2014, 14:06:16
    #38634581
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Cygapb-007,

я правильно понял, можно использовать в вычисляемых полях значение автоинкрементного.... типо сначала выставляюца значения по умолчанию, а ведь автоинкремент, это не вычисляемое, а умалчивоемое значение, которое равно переменной щётчика), а потом уже вычисляемые?
...
Рейтинг: 0 / 0
06.05.2014, 14:41:55
    #38634631
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
alex564657498765453Cygapb-007,

я правильно понял, можно использовать в вычисляемых полях значение автоинкрементного.... типо сначала выставляюца значения по умолчанию, а ведь автоинкремент, это не вычисляемое, а умалчивоемое значение, которое равно переменной щётчика), а потом уже вычисляемые?В триггерах из примера 15977464 нигде (кроме операций логирования) не используются ни вычисляемое поле, ни инкремент, однако результат обработки правильный:)
Более того, в примере можно вообще убрать триггеры - результат все равно будет верным
MSDN: Инструкция CREATE TABLE (Transact-SQL) , примеры К, Л, М

Однако это уже обсуждение MS SQL, а не MySQL ;-)
...
Рейтинг: 0 / 0
06.05.2014, 15:59:36
    #38634729
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Cygapb-007alex564657498765453Cygapb-007,

я правильно понял, можно использовать в вычисляемых полях значение автоинкрементного.... типо сначала выставляюца значения по умолчанию, а ведь автоинкремент, это не вычисляемое, а умалчивоемое значение, которое равно переменной щётчика), а потом уже вычисляемые?В триггерах из примера 15977464 нигде (кроме операций логирования) не используются ни вычисляемое поле, ни инкремент, однако результат обработки правильный:)
Более того, в примере можно вообще убрать триггеры - результат все равно будет верным
MSDN: Инструкция CREATE TABLE (Transact-SQL) , примеры К, Л, М

Однако это уже обсуждение MS SQL, а не MySQL ;-)

Код: php
1.
2.
3.
4.
5.
6.
7.
<?
function Cygapb-007()
{
please return mssql(identity) != mysql(autoincrement)     ? 'yes' : 'no' ; 
}

Cygapb-007(); <ENTER>
...
Рейтинг: 0 / 0
06.05.2014, 16:26:43
    #38634750
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
alex564657498765453
Код: php
1.
2.
3.
4.
5.
6.
7.
<?
function Cygapb-007()
{
please return mssql(identity) != mysql(autoincrement)     ? 'yes' : 'no' ; 
}

Cygapb-007(); <ENTER>


Можно сказать 'yes', равно как и 'no'
http://dev.mysql.com/doc/refman/5.5/en/create-table.html An integer or floating-point column can have the additional attribute AUTO_INCREMENT. When you insert a value of NULL (recommended) or 0 into an indexed AUTO_INCREMENT column, the column is set to the next sequence value. Typically this is value+1, where value is the largest value for the column currently in the table. AUTO_INCREMENT sequences begin with 1. http://msdn.microsoft.com/ru-ru/library/ms174979.aspx IDENTITY
Указывает, что новый столбец является столбцом идентификаторов. При добавлении в таблицу новой строки компонент Компонент Database Engine формирует для этого столбца уникальное последовательное значение. Столбцы идентификаторов обычно используются с ограничением PRIMARY KEY для поддержания уникальности идентификаторов строк в таблице. Свойство IDENTITY может быть присвоено столбцам типа tinyint, smallint, int, bigint, decimal(p,0) или numeric(p,0). Для каждой таблицы можно создать только один столбец идентификаторов. Ограниченные значения по умолчанию и ограничения DEFAULT не могут использоваться в столбце идентификаторов. Необходимо указать как начальное значение, так и приращение, или же не указывать ничего. Если ничего не указано, применяется значение по умолчанию (1,1).

Кроме этого:
в MS SQL необходимо предпринять дополнительные действия для добавления указанных ID (в списке INSERT-а).

вместо одной функции LAST_INSERT_ID(), LAST_INSERT_ID(expr) предусмотрены 3 (!) аналогичных: SCOPE_IDENTITY, IDENT_CURRENT и @@IDENTITY

Может, и еще что есть разного, навскидку не помню
...
Рейтинг: 0 / 0
06.05.2014, 19:14:11
    #38634935
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Cygapb-007,

Давай вернёмся к мусклу, и проблеме с автоинкрементом и его детектом по LAST_INSERT_ID()

натолкнулся на похожее.

мне надо(сокр.)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE IVENT myivent ...

begin

declare iID INT;

insert into eventlogs(name) values('myivent');

set iID=LAST_INSERT_ID();

......


UPDATE eventlogs SET finish_time = NOW() WHERE id = iID;
end


и не сработает. ибо код события, как и множественной вставки, это действие, во время которого внутреняя переменная номера последней вставленой строки не обновляеться. функция нулл возвращает.

в ивенте также нельзя использовать пользовательские функции...
я думал про вариант, аля сделать функцию лог, которая будет возвращать айди вставки, и функцию апдейт и вызывать... а вот кукишь.

что подскажешь?

ЗЫ:любой вариант, лиш бы мы
1)сразу на старте заносили записить про старт, ибо время выполнения может быть сутки, и другие процесы в системе должны видеть какие события работают в данный момент

2)по окончанию могли занести данные о результате работы ивента(типо код возврата как у функций) и время окончания

3)на выходе имели одну таблицу (айди_лог,имя_события, начало, конец, код_возврата)

плодить лишние таблицы аля костыли тоже не хочеться...

вообщем склоняюсь на варианте

тело евента перенести в хранимую процедуру, туда в начало вшить проверку на кто запустил....запускаеться только планировщиком.

а сам ивент, он только и делает что запускает процедуру эту.

или это не феншуй???
...
Рейтинг: 0 / 0
07.05.2014, 11:56:12
    #38635379
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
alex564657498765453,

как-то так? http://sqlfiddle.com/#!2/315277/1
...
Рейтинг: 0 / 0
07.05.2014, 12:42:31
    #38635433
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавление тригера "дата добавления"
Cygapb-007,

извините. у меня было две ошибки.

1)я сделал ошибку в наборе кода, так и не понял где, но одно поле было названо не верно ,и апдейт просто не находил такого поля в таблице, но так как это ивент, я не видел сообщения про ошибку... увидел когда код перенёс в процедуру, и стартанул вручную.

2)хоть в документации и написано что ласт_инсерт_айди не должен работать, он работает...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Добавление тригера "дата добавления" / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]