我无法在此处插入日期。我的 table 是:
CREATE TABLE salary
(
emp_id int NOT NULL,
basic int,
net_salary double,
salary_date date,
FOREIGN KEY(emp_id) REFERENCES employee(emp_id)
)
当我给予时:
INSERT INTO `salary`(`emp_id`, `basic`, `net_salary`, `salary_date`)
VALUES (121,5000, ,2019-06-21)
它显示一条错误消息:
1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在第 1 行“2019-06-21)”附近使用的正确语法
注意:我没有将 net_salary 设置为 0/null,因为我已经创建了一个 View :
CREATE VIEW calc_salary AS
SELECT basic
FROM salary
WHERE (basic+0.45*basic-0.09*basic-0.15*basic) = net_salary
即net_salary是从basic开始计算的。
最佳答案
net_salary 的值丢失,我们需要在日期文字周围使用单引号。要消除语法错误,需要像这样:
INSERT INTO `salary` (`emp_id`, `basic`, `net_salary`, `salary_date`)
VALUES (121,5000,NULL,'2019-06-21')
^^^^ ^ ^
如果我们想要计算 net_salary
的值,我们可以在 INSERT 语句中执行此操作。
如果WHERE子句 View 中显示的条件:
(basic+0.45*basic-0.09*basic-0.15*basic) = net_salary
实际上代表了我们用来从basic
计算net_salary
的公式,
然后我们可以将其表示为一个作业:
net_salary := ( basic*1.0 ) + ( basic*+0.45 ) + ( basic*-0.09 ) + ( basic*-0.15 )
我们可以将其分解并重写为等效表达式:
net_salary := basic * ( (1.0) + (0.45) + (-0.09) + (-0.15) )
这样,我们就可以执行类似的操作,为要插入的行提供 net_salary
值:
INSERT INTO `salary` (`emp_id`, `basic`, `net_salary`, `salary_date`)
VALUES (121,5000, 5000 * ( (1.0) + (0.45) + (-0.09) + (-0.15) ) ,'2019-06-21')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
但是,如果net_salary
的值总是根据basic
的值计算出来,那么将其存储为一列似乎是多余的,因为我们可以计算当我们需要它时,它的值(value)。例如:
SELECT s.emp_id
, s.basic
, s.basic * ( (1.0) + (0.45) + (-0.09) + (-0.15) ) AS calc_net_salary
, s.salary_date
FROM salary
WHERE ...
如果我们这样做,那么我们可以从表中删除 net_salary
列。
但是,如果我们确实必须将该计算值存储在列中,那么我们可以让 BEFORE INSERT
和 BEFORE UPDATE
触发器为我们计算该值。
DELIMITER $$
CREATE TRIGGER salary_bi
BEFORE INSERT ON salary
FOR EACH ROW
BEGIN
SET NEW.net_salary := NEW.basic * ( (1.0) + (0.45) + (-0.09) + (-0.15) );
END$$
DELIMITER ;
关于mysql - 我无法在 mysql 表中发布日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56757416/