|
|
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Здравствуйте Таблица `steps` Колонка `add` (datetime`) и колонка uid (varchar 255) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Триггер: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. В результате при добавлении строки появляется ошибка: #1062 - Duplicate entry '' for key 'uid' Подскажите почему такое происходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2014, 10:07:32 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Извиняюсь, скриншот прилепил случайно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2014, 10:08:31 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Сообразил. Я убрал уникальный индекс на колонке uid. Но другая проблема появилась: #1442 - Can't update table 'steps' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. Я первый раз имею дело с тригерами. Прошу помощи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2014, 10:10:57 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Я понимаю что update можно делать только с таблицей не вызывающей тригер. Но как тогда иначе можно реализовать такую функцию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2014, 10:46:11 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Хотел бы расширить вопрос о триггерах, адресуясь знатокам именно 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 такой подход кажется несколько... диковатым... Может быть, вы сможете подсказать более тривиальное естественное решение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.05.2014, 22:28:30 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Cygapb-007В то же время в триггере BEFORE INSERT эти операции (во всяком случае, set new.field=value) выполнить можно, но - автоидентификатор (в этот момент) еще не присвоен.а зачем вам автоид в триггере? у вас значения полей на него завязаны, что ли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2014, 17:39:04 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
tanglirCygapb-007В то же время в триггере BEFORE INSERT эти операции (во всяком случае, set new.field=value) выполнить можно, но - автоидентификатор (в этот момент) еще не присвоен.а зачем вам автоид в триггере? у вас значения полей на него завязаны, что ли?Угу, была такая задача, на деревьях в строке полный путь до корня, включая текущий id Сейчас уже не актуально, но в принципе не понятно, как влёгкую выкрутиться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2014, 18:41:40 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 04:30:43 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
делайте 2 таблицы, 1 таблица содержит оригинальные данные, 2 таблица содержит pk из 1 ой таблицы, и вычисляемые(обновлямые) данные при событии триггера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 08:12:00 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
bochkovделайте 2 таблицы, 1 таблица содержит оригинальные данные, 2 таблица содержит pk из 1 ой таблицы, и вычисляемые(обновлямые) данные при событии триггераЯсно, спасибо. Нельзя - так нельзя. PS. Я сделал немного по-другому : Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 11:39:13 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, а в МС СКЛ можно для вычисляемых полей использовать автоинкрементное значение??? оно ведь вроде тоже не доступно ещо на момент вычисления вычисляемых значений...или мне память изменила? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2014, 19:17:51 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
alex564657498765453Cygapb-007, а в МС СКЛ можно для вычисляемых полей использовать автоинкрементное значение??? оно ведь вроде тоже не доступно ещо на момент вычисления вычисляемых значений...или мне память изменила?там есть натуральные вычисляемые поля (в том числе и материализуемые, в т.ч. и индексируемые), так что проблемы как таковой нет. триггеров instead of insert практически не писал, достаточно after insert, но могу попозже посмотреть, что там и как по части идентификаторов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2014, 09:42:04 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
alex564657498765453Cygapb-007, а в МС СКЛ можно для вычисляемых полей использовать автоинкрементное значение??? оно ведь вроде тоже не доступно ещо на момент вычисления вычисляемых значений...или мне память изменила?вот сходу пример про триггеры ms sql, вроде все видно с него... http://sqlfiddle.com/#!6/d4395/1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2014, 09:52:33 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, я правильно понял, можно использовать в вычисляемых полях значение автоинкрементного.... типо сначала выставляюца значения по умолчанию, а ведь автоинкремент, это не вычисляемое, а умалчивоемое значение, которое равно переменной щётчика), а потом уже вычисляемые? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2014, 14:06:16 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
alex564657498765453Cygapb-007, я правильно понял, можно использовать в вычисляемых полях значение автоинкрементного.... типо сначала выставляюца значения по умолчанию, а ведь автоинкремент, это не вычисляемое, а умалчивоемое значение, которое равно переменной щётчика), а потом уже вычисляемые?В триггерах из примера 15977464 нигде (кроме операций логирования) не используются ни вычисляемое поле, ни инкремент, однако результат обработки правильный:) Более того, в примере можно вообще убрать триггеры - результат все равно будет верным MSDN: Инструкция CREATE TABLE (Transact-SQL) , примеры К, Л, М Однако это уже обсуждение MS SQL, а не MySQL ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2014, 14:41:55 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Cygapb-007alex564657498765453Cygapb-007, я правильно понял, можно использовать в вычисляемых полях значение автоинкрементного.... типо сначала выставляюца значения по умолчанию, а ведь автоинкремент, это не вычисляемое, а умалчивоемое значение, которое равно переменной щётчика), а потом уже вычисляемые?В триггерах из примера 15977464 нигде (кроме операций логирования) не используются ни вычисляемое поле, ни инкремент, однако результат обработки правильный:) Более того, в примере можно вообще убрать триггеры - результат все равно будет верным MSDN: Инструкция CREATE TABLE (Transact-SQL) , примеры К, Л, М Однако это уже обсуждение MS SQL, а не MySQL ;-) Код: php 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2014, 15:59:36 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
alex564657498765453 Код: php 1. 2. 3. 4. 5. 6. 7. Можно сказать '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 Может, и еще что есть разного, навскидку не помню ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2014, 16:26:43 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, Давай вернёмся к мусклу, и проблеме с автоинкрементом и его детектом по LAST_INSERT_ID() натолкнулся на похожее. мне надо(сокр.) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. и не сработает. ибо код события, как и множественной вставки, это действие, во время которого внутреняя переменная номера последней вставленой строки не обновляеться. функция нулл возвращает. в ивенте также нельзя использовать пользовательские функции... я думал про вариант, аля сделать функцию лог, которая будет возвращать айди вставки, и функцию апдейт и вызывать... а вот кукишь. что подскажешь? ЗЫ:любой вариант, лиш бы мы 1)сразу на старте заносили записить про старт, ибо время выполнения может быть сутки, и другие процесы в системе должны видеть какие события работают в данный момент 2)по окончанию могли занести данные о результате работы ивента(типо код возврата как у функций) и время окончания 3)на выходе имели одну таблицу (айди_лог,имя_события, начало, конец, код_возврата) плодить лишние таблицы аля костыли тоже не хочеться... вообщем склоняюсь на варианте тело евента перенести в хранимую процедуру, туда в начало вшить проверку на кто запустил....запускаеться только планировщиком. а сам ивент, он только и делает что запускает процедуру эту. или это не феншуй??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2014, 19:14:11 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 11:56:12 |
|
||
|
Добавление тригера "дата добавления"
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, извините. у меня было две ошибки. 1)я сделал ошибку в наборе кода, так и не понял где, но одно поле было названо не верно ,и апдейт просто не находил такого поля в таблице, но так как это ивент, я не видел сообщения про ошибку... увидел когда код перенёс в процедуру, и стартанул вручную. 2)хоть в документации и написано что ласт_инсерт_айди не должен работать, он работает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2014, 12:42:31 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38632694&tid=1834877]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
82ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
| others: | 219ms |
| total: | 413ms |

| 0 / 0 |
