powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Добавление тригера "дата добавления"
20 сообщений из 20, страница 1 из 1
Добавление тригера "дата добавления"
    #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
Добавление тригера "дата добавления"
    #38630798
Фотография Alexei772
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, скриншот прилепил случайно.
...
Рейтинг: 0 / 0
Добавление тригера "дата добавления"
    #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
Добавление тригера "дата добавления"
    #38630814
Фотография Alexei772
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понимаю что update можно делать только с таблицей не вызывающей тригер. Но как тогда иначе можно реализовать такую функцию?
...
Рейтинг: 0 / 0
Добавление тригера "дата добавления"
    #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
Добавление тригера "дата добавления"
    #38632464
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007В то же время в триггере BEFORE INSERT эти операции (во всяком случае, set new.field=value) выполнить можно, но - автоидентификатор (в этот момент) еще не присвоен.а зачем вам автоид в триггере? у вас значения полей на него завязаны, что ли?
...
Рейтинг: 0 / 0
Добавление тригера "дата добавления"
    #38632520
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tanglirCygapb-007В то же время в триггере BEFORE INSERT эти операции (во всяком случае, set new.field=value) выполнить можно, но - автоидентификатор (в этот момент) еще не присвоен.а зачем вам автоид в триггере? у вас значения полей на него завязаны, что ли?Угу, была такая задача, на деревьях в строке полный путь до корня, включая текущий id

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

add TIMESTAMP DEFAULT CURRENT_TIMESTAMP
...
Рейтинг: 0 / 0
Добавление тригера "дата добавления"
    #38632745
bochkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делайте 2 таблицы,
1 таблица содержит оригинальные данные,
2 таблица содержит pk из 1 ой таблицы, и вычисляемые(обновлямые) данные при событии триггера
...
Рейтинг: 0 / 0
Добавление тригера "дата добавления"
    #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
Добавление тригера "дата добавления"
    #38633699
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cygapb-007,

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

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

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

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

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

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

Однако это уже обсуждение MS SQL, а не MySQL ;-)
...
Рейтинг: 0 / 0
Добавление тригера "дата добавления"
    #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
Добавление тригера "дата добавления"
    #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
Добавление тригера "дата добавления"
    #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
Добавление тригера "дата добавления"
    #38635379
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453,

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

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

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

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


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