自定义MySQL默认值

自定义MySQL默认值,mysql,Mysql,MySQL表字段是否可以有如下默认值: 13-001 前2位为当年的后2位,如2013=13 最后3位数字是前2位数字相同的行+1的最大计数,并且为零填充。 因此,当当前年份发生变化,最后一个值为13-461时,下一个值将为14-001 tblpourchase表有3个字段: PRKey:自动递增INT PRDate:当前时间戳 PRNo:VARCHAR(6)'这将包含13-999值否。默认值必须是一个文本值,或者是几个特殊的内置函数之一(如当前时间戳用于时间戳列)。表结构与您的表结构略有不同(

MySQL表字段是否可以有如下默认值:
13-001
前2位为当年的后2位,如2013=13

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

tblpourchase表有3个字段:
PRKey:自动递增INT
PRDate:当前时间戳

PRNo:VARCHAR(6)'这将包含13-999值

否。默认值必须是一个文本值,或者是几个特殊的内置函数之一(如
当前时间戳
用于
时间戳
列)。

表结构与您的表结构略有不同(在你发布你的结构之前,我就开始写这篇文章了——我使用了datetime字段),但我认为你仍然应该知道它是如何工作的:

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
字段分为
年份
数字
字段,并仅使用计数部分根据@Barmar创建每年自动增量

,将13-999设置为默认值是不可能的。
@t.niese提到的MySQL触发器有点棘手,但我已经做到了

我想出了一个解决方案,在插入过程中包含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())

你能在数据库中使用
TRIGGER
s吗?@t.niese我还没有想到,你能用triggers发布一个答案吗?谢谢。我会研究triggers。我一定会研究这个。谢谢。@Ruben你需要检查一下
是否计数(*)+1
符合您的要求。例如,如果您在本年度删除条目,则会失败,因为您将获得冲突的数字。但是,由于您写入了
行的最大计数+1
,我认为不会发生这种情况。