powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триггер с условием запрета insert
23 сообщений из 23, страница 1 из 1
Триггер с условием запрета insert
    #39052168
drunja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица books:
id quan
1 10
2 5
3 1
1 8
2
3

Нужно триггером запретить вставку определённого id, где есть хоть одна строка с quan = NULL
Например, в таблицу books в данном случае запретить вставку строк со значением id = 2 и id = 3, не запрещать вставку строки id = 1 так как нету строки id = 1 с quan = NULL.
Пожалуйста, помогите составить условие.
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39052522
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drunja,

1) триггер BEFORE INSERT
2) в триггере одна проверка: если EXISTS в BOOKS строка, где ID=NEW.ID и QUAN IS NULL, то выдать SIGNAL о недопустимости INSERT

Все.
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39052531
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надежно и только триггером, пожалуй, никак.
Сценарий:
Сессия 1Сессия 2Начало транзакцииНачало транзакцииINSERT INTO books (id,quan) VALUES (10,NULL)INSERT INTO books (id,quan) VALUES (10,1)COMMITCOMMITВ результате в таблице две записи с NULL и с 1 в поле quan.

Пока нет триггеров на COMMIT, защититься от такого сценария невозможно.

Как вариант решения - писать свою процедуру, с полной блокировкой таблицы, а прямую запись в таблицу запретить.
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39052553
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Монстр
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39052641
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin
  if new.quan is null and 
     exists (select 'x' from books where id = new.id and quan is null) 
  then
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 
        'Odd constraint \'no more than one NULL `quan` for same `id` \' fails for table `{SCHEMA_NAME}`.`books`';
  end if;
end
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39052643
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотища
Код: sql
1.
new.quan is null

Это лишнее.

А вообще - против моего сценария не поможет.
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39052699
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
насчет того, что new.quan is null согласен. Я неверно понял ТС.
Что триггер не обеспечит выполнение ограничения при инсертах из разных сессий полгостью согласен.

Возражу только о необходимости полной блокировки таблицы - можно использовать lock (не знаю как оно по-русски в контексте MySQL).
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39052709
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаВозражу только о необходимости полной блокировки таблицы - можно использовать lock (не знаю как оно по-русски в контексте MySQL).Это как замок, который помогает только от честного человека.
Если таблицу модифицирует только доверенное приложение, отлаженное в достаточной степени, тогда - да, GET_LOCK() может помочь.
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39052847
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
GET_LOCK() разрешен в хранимых процедурах / функциях, LOCK_TABLES - нет (MySQL 5.5).

И получется, что LOCK_TABLES это как замок, который помогает только от честного человека... :'(

            и как с этим жЫть...
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39052944
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скукотищаLOCK_TABLES - нетХм, действительно.
"Ненавижу компьютеры!" (с) Один из сотрудников с моей работы. :)
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053098
drunja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
begin
  if new.quan is null and 
     exists (select 'x' from books where id = new.id and quan is null) 
  then
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 
        'Odd constraint \'no more than one NULL `quan` for same `id` \' fails for table `{SCHEMA_NAME}`.`books`';
  end if;
end


Работает.
Благодарю, в самую точку!
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053109
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drunjaРаботает.В единственной сессии.
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053175
drunja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftскукотища
Код: sql
1.
new.quan is null

Это лишнее.

А вообще - против моего сценария не поможет.
Так же меня интересует,
Код: sql
1.
new.quan is null

при нем я так понимаю нельзя вставлять в строку только id, а обязательно id и quan. Но у меня это не работает, могу вставлять таким запросом
Код: sql
1.
2.
3.
INSERT INTO books
(id)
VALUES (2);


и запрет триггера не срабатывает, как сделать чтоб он срабатывал?
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053181
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drunjaпри нем я так понимаю нельзя вставлять в строку только id, а обязательно id и quanФормулировка некорректна. В реляционных СУБД нельзя вставлять отдельное поле, всегда вставляется запись со всеми полями целиком.
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053231
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> drunja,
> при нем я так понимаю нельзя вставлять в строку только id, а обязательно id и quan.

Понимаете неправильно
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
begin
  if new.quan is null and 
-- если у добавляемой записи поле `quan` пустое и не важно, не указали его в запросе, или указали равным NULL

     exists (select 'x' from books where id = new.id and quan is null) 
-- то проверить наличие записи с ИД равным ИД добавляемой записи и пустым полем `quan`

  then
-- если звёзды сошлись, - пожаловаться на жЫсть и откатить изменения
-- При этом, внезапно! Если одним запросом добавлялось несколько записей, то из-за одной паршивой овцы 
-- достанется всем остальным, - ни одна запись из "пачки" добавлена не будет.
    SIGNAL SQLSTATE '45000'
    SET MESSAGE_TEXT = 

-- сообщение об ошибке не пробовали читать ?
        'Odd constraint \'no more than one NULL `quan` for same `id` \' fails for table `{SCHEMA_NAME}`.`books`';
  end if;
end



> ... и запрет триггера не срабатывает, как сделать чтоб он срабатывал?

закоментировать часть
Код: sql
1.
 new.quan is null and  



НО ЭТО НЕ РЕШАЕТ ПРОБЛЕМУ конкуретного добавление записей из разнючих сессий
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053240
drunja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища> drunja,
-- то проверить наличие записи с ИД равным ИД добавляемой записи и пустым полем `quan`

Как заменить "то" на "и", чтоб было 2 условия:
Первое условие
if exists (select 'x' from books where id = new.id and quan is null) - с этим разобрались.

Второе условие
new.quan is null
как сделать чтоб оно работало?
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053245
drunja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища,
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DELIMITER //
CREATE TRIGGER pp 
BEFORE INSERT ON books
FOR EACH ROW
BEGIN
IF new.quan is not null THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT =
'Odd constraint \'no more than one NULL `quan` for same `id` \' fails for table `{SCHEMA_NAME}`.`books`';
END IF;
END
//
DELIMITER;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
DELIMITER //
CREATE TRIGGER pp 
BEFORE INSERT ON books
FOR EACH ROW
BEGIN
IF exists (select 'x' from books where id = new.id and quan is null) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT =
'Odd constraint \'no more than one NULL `quan` for same `id` \' fails for table `{SCHEMA_NAME}`.`books`';
END IF;
END
//
DELIMITER;



По отдельности всё работает, а так чтоб в одном триггере было 2 условия как сделать?
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053258
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
drunja, про OR читать не приходилось?
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053262
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> drunja,
> Как заменить "то" на "и", чтоб было 2 условия:
> {skipped,reason:многа вроде-бы и понятных букав но смысл ускользает}


> По отдельности всё работает, а так чтоб в одном триггере было 2 условия как сделать?
$#%$!& ....


Отсюда 18157968 . Код убран, оставлены только комментарии. Почти все.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    Если у добавляемой записи поле `quan` пустое и не важно, не указали его в запросе, или указали равным NULL
    То проверить наличие записи с ИД равным ИД добавляемой записи и пустым полем `quan`

    Если _ОБА_ условия выполняются  - сообщить вызывающему об ошибке, сгенерировав исключение с
    сообщением "
        Нарушено странноватое правило для таблицы имярек 
           `запретить создание более одной записи с одинаковыми ИД и пустыми полями КВАН`
    "



    ЗЫ: При данной архитектуре, т.к. исключение не обрабатывается, то будет произведен откат изменений транзакции в
          рамках которой произошла данная исключительная ситуёвина... а может даже и клиент покрашится.
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053265
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Cygapb-007
ОФФ> drunja, про OR читать не приходилось?

... не читатель, ... стихийный копи-пастер
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053271
drunja
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
скукотища,
Разобрался
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
DELIMITER //
CREATE TRIGGER pp 
BEFORE INSERT ON books
FOR EACH ROW
BEGIN
IF exists (select * from books where id = new.id and quan is null) or (new.quan is not null) 

THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT =
'Odd constraint \'no more than one NULL `quan` for same `id` \' fails for table 

`{SCHEMA}`.`books`';
END IF;
END
//
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053274
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
drunja,
уточни, выполнение каких ты хочешь добиться.

Для упрощения представим, что в таблицу только одно поле QUAN.
Тебе надо:

- запретить наличие более одной "пустой" одной записи

или

- после добавления первой "пустой" записи запретить добавление новых записей до тех пор,
  пока "пустая" запись не будет заполнена либо удалена

или

- что-то совсем другое
...
Рейтинг: 0 / 0
Триггер с условием запрета insert
    #39053276
скукотища
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> drunja,
> Разобрался

Поздравляю. Попробуй добавить запись с ИД, которого ещё нет в таблице и пустым КВАН.
Если результат устроит, - возвращайся :)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триггер с условием запрета insert
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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