2

MySQL 表字段是否有可能具有这样的默认值:
13-001
前 2 位数字是当前年份的后 2 位数字,例如 2013 = 13

最后 3 位是前 2 位相同的最大行数 + 1,并且是零填充的。
因此,当当前年份发生变化并且最后一个值为 13-461 时,下一个值将是 14-001。

tblPurchase表有 3 个字段:PRKey
: Auto-Increment INT
PRDate : Current_Timestamp
PRNo : VARCHAR(6) '这将包含 13-999 值

4

3 回答 3

0

不可以。默认值必须是文字值,或者是一些特殊的内置函数之一(如current_timestamptimestamp)。

于 2013-08-30T09:04:38.547 回答
0

表结构与你的有点不同(我在你发布你的结构之前开始写这个 - 我使用日期时间字段),但我认为你仍然应该了解它是如何工作的:

CREATE TABLE IF NOT EXISTS `TestTable` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` datetime NOT NULL,
  `no` varchar(6) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

这里是INSERT触发器。

DELIMITER //
CREATE TRIGGER `Test` BEFORE INSERT ON `TestTable`
  FOR EACH ROW BEGIN
    DECLARE c INT;
    SET c = (SELECT COUNT(*) + 1 FROM TestTable WHERE YEAR(date)=YEAR(NOW()));
    SET NEW.date = NOW();
    SET NEW.no = CONCAT( SUBSTR(YEAR(NOW()),-2) ,"-", LPAD(c,3,'0') );
  END
//
DELIMITER ;

但是您可能应该考虑另一种结构并将您的PRNo 字段拆分为一个字段year和一个number字段,并且仅使用计数部分来创建每年的自动增量

于 2013-08-30T09:26:31.017 回答
0

根据@Barmar,无法将 13-999 设置为默认值。
@t.niese 提到的 MySQL 触发器有点棘手,但我快到了。

我想出了一个解决方案,在 INSERT 期间包含 13-999 值:

INSERT INTO tblPurchase(PRNo, other_fields_here)
SELECT
  CONCAT(
    RIGHT(YEAR(CURDATE()),2),
    '-',
    LPAD(CAST(COUNT(PRKey) + 1 AS DECIMAL,3,'0')
  ),
  other_fields_here
FROM
  tblPurchase
WHERE
  Year(PRDate)=YEAR(CURDATE())
于 2013-09-03T02:38:39.150 回答