在mysql中创建不可变字段

Fel*_*ype 5 mysql

因为"创造时间"的目的,我想创造一个TIMESTAMP领域DEFAULT CURRENT_TIMESTAMP.但是,如果有人或某种方式发生了变化,TIMESTAMP,我的数据将不一致.

有没有办法我可以确保它不会改变,除非我删除行并重新插入它,除了应用程序级别?


提供建议的答案,我可以解决这样的问题

CREATE TRIGGER consistency1 BEFORE UPDATE ON table1
FOR EACH ROW
BEGIN
    IF NEW.creationtime != OLD.creationtime THEN
       SET NEW.creationtime = OLD.creationtime;
    END IF;
END;
Run Code Online (Sandbox Code Playgroud)

STT*_*LCU 7

由于我的评论已被赞赏,这是扩展版本.

我个人认为不可能.

无论如何,你可以尝试一些事情:

  1. 确保只有您的应用程序可以在数据库上写入

  2. 写这样的触发器(伪代码!)

    create trigger prevent_change_timestamp on tbl_name
    before update
    #fetch old row value
    #verify if the timestamp field has been changed
    #raise an error (any SQL error will do)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 或者像这样

    create trigger revert_change_timestamp on tbl_name
    after update
    #fetch pre-change row value
    #update the row with the "old" value in place of the new one
    
    Run Code Online (Sandbox Code Playgroud)

如果可能的话,我个人会选择第3种选择.无论如何,第二个也很好.除非必要,否则我不会依赖第一个选项(例如:无法访问触发器功能)

更多信息:参考


mik*_*ent 5

有趣的是,数据库应用程序不提供此功能作为标准:不仅适用于“创建的”时间戳字段,还适用于自动增量 id 字段等内容,以及您可能希望在创建记录时设置的任何其他值,然后永远不允许改变......想知道理由是什么?

  • 通过引用一些“数据库应用程序不提供此功能作为标准”的来源,可以大大改善这个答案。 (3认同)