powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Получить DEFAULT VALUE в триггере - напомните, есть ли простое решение?
3 сообщений из 3, страница 1 из 1
Получить DEFAULT VALUE в триггере - напомните, есть ли простое решение?
    #39340485
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имеется таблица и обслуживающее её приложение. В структуру таблицы добавлено поле. Чтобы обеспечить правильное заполнение нового поля до корректировки приложения, в качестве временного решения создаётся триггер, который заполняет значение этого поля, если значение для него отсутствует в запросе.

Если поле не имеет значения по умолчанию, то логика работает как нужно.
console output
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
mysql> CREATE TABLE test (
    -> id SERIAL PRIMARY KEY,
    -> val1 INT NOT NULL,
    -> val2 INT NOT NULL
    -> );
Query OK, 0 rows affected (0.29 sec)

mysql> CREATE TRIGGER t_test
    -> BEFORE INSERT
    -> ON test
    -> FOR EACH ROW
    -> SET NEW.val2 = COALESCE(NEW.val2, 999);
Query OK, 0 rows affected (0.08 sec)

mysql> INSERT INTO test (val1, val2)
    -> SELECT 111,222 UNION ALL
    -> SELECT 333,444 ;
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> INSERT INTO test (val1)
    -> SELECT 555 ;
Query OK, 1 row affected (0.04 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> SHOW WARNINGS;
Empty set (0.00 sec)

mysql> SELECT * FROM test;
+----+------+------+
| id | val1 | val2 |
+----+------+------+
|  1 |  111 |  222 |
|  2 |  333 |  444 |
|  4 |  555 |  999 |
+----+------+------+
3 rows in set (0.03 sec)


Однако при наличии такого значения оно добавляется в псевдотаблицу NEW до срабатывания триггера, и при неравенстве значения по умолчанию и значения, присваиваемого триггером, возникает проблема.
console output
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
mysql> CREATE TABLE test (
    -> id SERIAL PRIMARY KEY,
    -> val1 INT NOT NULL,
    -> val2 INT NOT NULL DEFAULT 0
    -> );
Query OK, 0 rows affected (0.30 sec)

mysql>
mysql> CREATE TRIGGER t_test
    -> BEFORE INSERT
    -> ON test
    -> FOR EACH ROW
    -> SET NEW.val2 = COALESCE(NEW.val2, 999);
Query OK, 0 rows affected (0.12 sec)

mysql>
mysql> INSERT INTO test (val1, val2)
    -> SELECT 111,222 UNION ALL
    -> SELECT 333,444 ;
Query OK, 2 rows affected (0.04 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql>
mysql> INSERT INTO test (val1)
    -> SELECT 555 ;
Query OK, 1 row affected (0.05 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql>
mysql> SHOW WARNINGS;
Empty set (0.00 sec)

mysql>
mysql> SELECT * FROM test;
+----+------+------+
| id | val1 | val2 |
+----+------+------+
|  1 |  111 |  222 |
|  2 |  333 |  444 |
|  4 |  555 |    0 |
+----+------+------+
3 rows in set (0.02 sec)



Напомните, есть ли способ проще, чем обращение к INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT, получить значение поля по умолчанию, чтобы сравнить с ним значение NEW.field?

PS. Понимаю, что DEFAULT VALUE известно разработчику. Считайте, что нужно избежать забывчивости разработчика - изменив структуру, он забыл изменить триггер.

PPS. Понимаю, что более правильное - это присвоение именно DEFAULT VALUE. Считайте, что меня любопытство заело.
...
Рейтинг: 0 / 0
Получить DEFAULT VALUE в триггере - напомните, есть ли простое решение?
    #39341064
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

В порядке бреда - DEFAULT() никак использовать не получится?
...
Рейтинг: 0 / 0
Получить DEFAULT VALUE в триггере - напомните, есть ли простое решение?
    #39341113
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft , увы, нет. Ошибка времени исполнения в триггере...
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Получить DEFAULT VALUE в триггере - напомните, есть ли простое решение?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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