保护列,禁止更新,只允许在MySQL中插入NULL

时间:2013-09-17 03:21:31

标签: mysql

我希望保护日期列中的现有日期不被覆盖。因此,禁止更新日期列,仅在现有字段值为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 ;

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

3 个答案:

答案 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';

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

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