我无法在此处插入日期。我的桌子是:
python logEverything.py |& tee -a logFile.text
我给的时候:
CREATE TABLE salary
(
emp_id int NOT NULL,
basic int,
net_salary double,
salary_date date,
FOREIGN KEY(emp_id) REFERENCES employee(emp_id)
)
它显示一条错误消息:
N.B .:我没有将net_salary设置为0 / null,因为我已经进行了查看:
INSERT INTO `salary`(`emp_id`, `basic`, `net_salary`, `salary_date`)
VALUES (121,5000, ,2019-06-21)
即net_salary应从基本计算。
答案 0 :(得分:0)
缺少net_salary的值,我们需要在日期文字周围使用单引号。要摆脱语法错误,它需要像这样:
INSERT INTO `salary` (`emp_id`, `basic`, `net_salary`, `salary_date`)
VALUES (121,5000,NULL,'2019-06-21')
^^^^ ^ ^
如果要计算net_salary
的值,可以在INSERT语句中执行。
如果WHERE子句视图中显示的条件:
(basic+0.45*basic-0.09*basic-0.15*basic) = net_salary
实际上代表了我们用来根据net_salary
计算basic
的公式,
然后我们可以将其表示为一项作业:
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
的值,将其存储为列似乎是多余的,因为我们可以在需要时随时计算该值。例如:
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 ;