我有一个ID字段,我希望它具有以下格式: YYMMDDXXXXXXXX,其中YY是年份,MM是月份,DD是当天,XXXXXXXX是带有前导零的实际ID号。当日期更改时,ID号码应重置为0。
首先,对于ID字段而言,这是一个不太好的做法/格式,它也将成为主键吗?
实现:
我将数据插入我的数据库扔了php,我想出了两种方法来实现上述格式。
date('Ymd')
导致apache崩溃
超过60个请求/秒。ALTER TABLE foo
AUTO_INCREMENT=(SELECT CURDATE()*100000000)
,但正如我所期望的那样CURDATE()不能
像这样使用。感谢你的时间,我的尝试的任何想法和/或帮助都会很棒。
答案 0 :(得分:1)
改为呈现以下架构:
CREATE TABLE foo (
id INTEGER AUTO_INCREMENT,
date DATETIME DEFAULT=NOW(),
PRIMARY KEY (id),
INDEX (date)
);
如有必要,可以使用查询生成类似样式的ID:
SELECT CAST(DATE_FORMAT(date,'%Y%m%d') AS UNSIGNED)*100000000 + id AS 'weird_id'
如果您的ID成为>这将会失控。 10,000,000,虽然我的测试显示使用BIGINT这个sheme应该能够处理一个或两个以上的零。您还可以通过选择此ID作为字符串来解决整数类型限制,例如:
SELECT CONCAT(DATE_FORMAT(date, '%Y%m%d'), LPAD(id,10,'0')) AS 'weird_id'
10
中的LPAD()
可以是您想要的任意数字。
你几乎拥有它。 CURDATE()
返回一个字符串,ALTER TABLE foo AUTO_INCREMENT=
需要一个整数,只有一个整数。没有函数,变量等。以下将起作用:
击:
mysql -u root -e "ALTER TABLE dbname.foo AUTO_INCREMENT = $(date +%Y%m%d0000000000);"
PHP:
$query = sprintf("ALTER TABLE dbname.foo AUTO_INCREMENT = %s;", str_pad(date("Ymd", time()), 18, '0'));
这会破坏:
请自己,以及从您那里继承此项目的人,帮助并在此表中保留单独的DATETIME
列,以便将来仍可从中收集有意义的,未破坏的信息。