MySQL:将字段的默认值设置为另一列的值
在MySQL中,可以使用默认值来设置表中的列(字段)的默认值。但是,有时候你可能需要将默认值设置为另一个列的值。
阅读更多:MySQL 教程
方法1:使用触发器
使用触发器来将一个字段的默认值设置为另一个列的值可能是一个不错的解决方案。让我们看看如何实现它。
假设我们有以下的表:
CREATE TABLE `employees` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` int(11) NOT NULL,
`date_of_birth` date NOT NULL,
`hired_date` date NOT NULL,
`years_of_service` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
);
我们希望每当我们添加了一位新员工时,年龄和聘用日期之间的差异会自动计算并存储在 years_of_service
字段中。我们可以使用以下触发器来实现这个功能:
DELIMITER //
CREATE TRIGGER `employees_calc_years_of_service` BEFORE INSERT ON `employees` FOR EACH ROW
BEGIN
DECLARE years_of_service INT;
SET years_of_service = TIMESTAMPDIFF(YEAR, NEW.hired_date, NEW.date_of_birth) + 1;
SET NEW.years_of_service = years_of_service;
END //
DELIMITER ;
当我们向 employees
表中添加新的员工时,触发器会检查 hired_date
和 date_of_birth
字段的值,并计算一个新的 years_of_service
值。接着,它会将这个值分配给 years_of_service
字段。
现在,让我们添加一位新的员工,并检查 years_of_service
字段是否已经被设置为正确的值。
INSERT INTO `employees` (`name`, `age`, `date_of_birth`, `hired_date`) VALUES
('John Doe', 35, '1985-01-01', '2010-01-01');
SELECT * FROM `employees` WHERE `name` = 'John Doe';
输出结果应该如下所示:
+----+----------+-----+---------------+-------------+-----------------+
| id | name | age | date_of_birth | hired_date | years_of_service |
+----+----------+-----+---------------+-------------+-----------------+
| 1 | John Doe | 35 | 1985-01-01 | 2010-01-01 | 26 |
+----+----------+-----+---------------+-------------+-----------------+
方法2:使用默认函数
如果你的 MySQL 版本支持默认函数,那么你可以简单地使用 CURRENT_TIMESTAMP
或 NOW()
函数来设置一个列的默认值,如下所示:
CREATE TABLE `employees` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` int(11) NOT NULL,
`date_of_birth` date NOT NULL,
`hired_date` date NOT NULL,
`years_of_service` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
);
在这个例子中,我们使用 CURRENT_TIMESTAMP
函数来设置 years_of_service
字段的默认值。当我们更新这个字段时,它会自动更新为当前时间。
总结
在 MySQL 中将一个列的默认值设置为另一个列的值是一个很有用的技巧。你可以使用触发器来实现这个功能,或者使用默认函数来获取当前时间戳或日期。这样做可以大大简化你的代码,并使你的数据库更加灵活和易于维护。