自定义MySQL默认值

时间:2013-08-30 08:56:05

标签: mysql

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

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

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

3 个答案:

答案 0 :(得分:0)

没有。默认值必须是文字值,或者是一些特殊的内置函数之一(例如current_timestamp列的timestamp)。

答案 1 :(得分:0)

表结构与你的结构略有不同(我在发布你的结构之前开始写这个 - 我使用了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字段拆分为yearnumber字段,并仅使用计数部分创建自动增量年

答案 2 :(得分: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())