我正在做一个mysql表,我有一个列在更新时有当前时间戳。这很好,因为我可以确切地看到有人上传某些内容。但我不希望列在编辑上传时更改。是否最好坚持使用一个名为“创建日期”的列,并在更新时使用NO,或者使用两列“日期创建&”修改日期“ - 如果这样,列属性和PHP更新语句的最佳实践是什么?
答案 0 :(得分:7)
我通常喜欢单独的“CreateDate”和“LastModifiedDate”。
至于设置它,如果您可以将CreateDate列的默认值设置为NOW()
,MySQL doesn't allow that,那就太好了。
因此,最简单的选择是使用插入触发器来执行此操作:
CREATE TRIGGER tbl_insert BEFORE INSERT ON `tbl`
FOR EACH ROW SET NEW.CreateDate = NOW(), NEW.LastModifiedDate = NOW();
ETA:
您也可以使用默认值TIMESTAMP
的{{1}}字段和LastModifiedDate的CURRENT_TIMESTAMP
约束。遗憾的是,您不能在同一个表上有两个这样的ON UPDATE CURRENT_TIMESTAMP
列,因此触发器是处理CreateDate列所必需的。
答案 1 :(得分:1)
这取决于您使用数据值的方式,但最好将 created_at 和 updated_at 作为表的属性。我发现这两个属性在测试和调试方面都很有用。
答案 2 :(得分:1)
就像额外信息一样,请记住PHP中的date();
函数。
除此之外,我肯定有一个上次修改日期,默认设置为创建日期。
答案 3 :(得分:1)
这不是一个真正的答案,因为我认为没有最佳实践,但这是一个我长期思考的问题。
在了解将要使用的表之前,我曾经创建了3个字段:创建日期,修改日期和用户,这将告诉我何时创建行以及谁,然后修改此行时谁...呃,不,我只有一个用户字段。那么我要做一个修饰符和一个创建者字段吗?然后用户更改文章中的所有内容,而另一个用户更正了错误拼写...谁改变了什么?
最后,我想查看数据库输入的历史记录,但是遵循这个非常糟糕的逻辑(创建,修改日期,用户),我什么都不知道。我知道你没有提到用户,但问题仍然是修改。什么时候被删除?你不会知道的。
但是让我说对了,我不会把石头扔给任何人:我的大多数桌子仍然是这样设计的。不过现在是改变的时候了,我打算创建一个历史表,但我还不确定它的结构。
所以,如果你不介意,在对你的问题发表意见的同时,我想建议我到目前为止的两个计划 - 彼此之间并没有太大的不同 - 看看人们对此有何看法。如果我污染了你的帖子,我会再次感到抱歉,但我只是抓住机会:-p
历史表#1:
文件465 Creation 2010-09-25 12:15:19 25
文件465修改2010-09-25 18:03:38 12
文件465修改2010-12-28 14:15:30 25
文件465删除2011-01-25 14:55:31 33
在这种情况下,我想知道是否会使用唯一ID,因为我不明白为什么我会寻找特定的行。这将始终是特定表的特定行的历史记录。
历史表#2:
文件465 {[{action:“creation”,date:“2010-09-25 12:15:19”,user:25},
{action:“modification”,date:“2010-09-25 18:03:38”,user:12},
{action:“modification”,date:“2010-12-28 14:15:30”,user:25},
{action:“删除”,日期:“2011-01-25 14:55:31”,用户:33}]}
这一行将通过JSON对象(或序列化数组)向我们显示一个表行的整个历史记录。所以我不会怀疑主键:table和rowId肯定会完成这项工作。即使我更喜欢这个,第一个结构优于这个结构的优点是你可以在一个时间范围内搜索事件,而这里不可能。
下一步将决定是否向这些结构添加文本字段以保留DIFF以便能够恢复以前的版本。但这是另一个故事。
我知道DateAdded和DateCreated对于某些情况可能是最佳解决方案,但如果目标是了解数据库条目的历史记录,我认为专用历史表是最佳选择。
答案 4 :(得分:0)
这就是我所拥有的,似乎在起作用:
名称类型属性默认
创建时间戳CURRENT_TIMESTAMP
更新CURRENT_TIMESTAMP CURRENT_TIMESTAMP