5

我想保护日期列中的现有日期不被覆盖。因此,不允许更新日期列,并且仅在现有字段值为 NULL 时才允许插入(日期列默认值为 NULL)。触发器是在 MySQL 中完成此任务的唯一方法吗?如果是这样,下面的触发器会起作用吗?

create trigger date_check
before insert, update on date
for each row
begin
if(date IS NOT NULL) then
 SIGNAL 'date already set'
end if ;
end ;

背景:我有一个表格,其中包含由于用户错误而意外更改的关键日期。我在用户界面中进行了一些检查以防止再次发生这种情况,但如果可能的话,我希望直接使用数据库进行另一层安全性。

4

3 回答 3

3

是的,在 MySQL 中,触发器是执行此操作的唯一方法。MySQL 不支持约束。

你的触发器不完全正确。首先,你有update on date,但这应该是update on <table name>。其次,您正在检查用于update的日期值。也许你的意思是:

create trigger date_check_update
before update on <the table name goes here>
for each row
begin
    if (old.date IS NOT NULL) then
        SIGNAL 'date already set'
    end if ;
end;

在这种insert情况下触发是没有意义的。

于 2013-09-17T03:30:21.203 回答
3

如果像我这样的人偶然发现了这个线程并且遇到了语法错误,那是因为“当您尝试通过 SIGNAL 引发错误时,您需要指定 SQLSTATE 这是错误代码,对于用户定义的通用错误代码,它的 45000 以及消息文本 MESSAGE_TEXT"

所以这SIGNAL条线应该是这样的。

signal SQLSTATE VALUE '45000' SET MESSAGE_TEXT = 'Your custom error message';

有关更多详细信息,请参阅此答案。

https://stackoverflow.com/a/42827275/4164651

于 2017-03-16T07:25:26.157 回答
1

但是,只需结合上述两个答案,如果您直接在终端上编写触发器,则必须在编写触发器之前更改分隔符,然后在完成后将其更改回来。

delimiter $$

 create trigger date_check_update
 before update on <the table name goes here>
 for each row
 begin
     if (old.date IS NOT NULL) then
    signal SQLSTATE VALUE '45000' SET MESSAGE_TEXT = 'Your custom error message';
  end if ;
end $$

delimiter ; 
于 2021-04-08T08:07:10.260 回答