我希望保护日期列中的现有日期不被覆盖。因此,禁止更新日期列,仅在现有字段值为NULL(日期列默认为NULL)时才允许插入。 triggers是在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 ;
背景:我有一张表格,其中包含由于用户错误而意外更改的关键日期。我在用户界面中进行了一些检查,以防止再次发生这种情况,但如果可能的话,还需要直接使用数据库进行另一层安全检查。
答案 0 :(得分:1)
是的,在MySQL中,触发器是唯一的方法。 MySQL不支持约束。
您的触发器不完全正确。首先,您有update on date
,但这应该是update on <table name>
。其次,您正在检查用于更新的日期值。也许你的意思是:
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
触发器没有意义。
答案 1 :(得分:1)
只是结合上述两个答案,但是,如果您直接在终端编写触发器,则必须在编写触发器之前更改分隔符,然后在完成后将其更改回来。
record.update(url: url)
答案 2 :(得分:0)
如果有人喜欢我偶然发现这个线程并且出现语法错误,那是因为“当您尝试通过SIGNAL引发错误时,您需要指定SQLSTATE,这是错误代码,而用户定义的通用错误代码是45000消息文本MESSAGE_TEXT“
因此SIGNAL
行应该如下所示。
signal SQLSTATE VALUE '45000' SET MESSAGE_TEXT = 'Your custom error message';
有关详细信息,请参阅此答案。