Рекомендуется использовать триггер для создания ограничения в MySQL? - PullRequest
1 голос
/ 10 октября 2019

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

Create table type(
id int primary key not null auto_increment,
class int not null default 0,
name string not null
)

Create table buddy (
id int primary key not null auto_increment,
value string not null)

Create table value (
id int primary key not null auto_increment,
type_id int not null,
buddy_id int default null,
value string not null,
relied_id int default null
foreign key type_id references type(id)
)

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

Внутри таблицы значений, некоторые значения могут ссылаться на таблицу друзей, а некоторые - нет.

if (the buddy_id inside value is not null){ 
   row with this buddy_id should be unique
} else{ 
   could have several instances with the nil buddy_id
}

Если значение buddy_id равно nil, что означает, что оно ни к чему не относится, оно может быть дублированным.

В моем модуле я получу сообщение из очереди моего коллеги, а затемвыполните следующие действия:

1), if I detect inside the message, there is a buddy_id, I need to use sql to check whether the value with this buddy_id is already in the database, if yes, just ignore, else should create one.
2), else, directly create a new one

в первом случае мой коллега продолжает посылать мне дублирующее сообщение, так как после того, как я получаю «ли экземпляр с этим buddy_id уже внутри базы данных» как результат как false,ему все еще нужно время, чтобы выполнить логику и создать новый экземпляр, а затем вставить его в базу данных. Возможно, есть разрыв между полученным результатом и вставкой.

В течение этого периода может появиться другое сообщение с тем же buddy_id, и оно вызовет другую подпрограмму или поток, но первая вставка еще не выполнена, вв этом случае он также обнаружит, что «экземпляр с этим buddy_id не находится внутри баз данных, я должен его создать».

В результате более одного экземпляра с одинаковым buddy_id будет вставлено в базу данных. enter image description here Я думаю, что эта картинка могла бы лучше проиллюстрировать то, о чем я говорю, два сообщения с одинаковым buddy_id приходят одно за другим, но когда обрабатывается сообщение 1 с buddy_id = 10, перед вставкой приходит сообщение 2 и находитbuddy_id = 10 отсутствует, поэтому сообщение 2 также создает экземпляр в базе данных.

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

Я также рассмотрел ограничение уникальности, но случай для buddy_id - «если это ноль, не уникально, если это не ноль, уникально». Я думаю, что этого нельзя сделать, просто используя ограничение уникального ключа.

Так что у кого-нибудь есть идея, следует ли использовать триггер для проверки перед вставкой, чтобы убедиться, что экземпляр не дублируется? Или любые другие рекомендуемые методы?

Спасибо.

...