“修改您的查询以添加一个从新工资中减去旧工资的列。 标记列增加。运行修订后的查询。“
嗯,根据我的解释,我首先尝试通过脚本添加列:
ALTER TABLE EMPLOYEES ADD (
INCREASE2 NUMBER(6));
然后:
INSERT INTO EMPLOYEES(INCREASE2)
SELECT (salary*1.155) - salary FROM EMPLOYEES;
错误de SQL:ORA-01400:nãoépossívelinserirNULL em(“HR”。“EMPLOYEES”。“EMPLOYEE_ID”) 01400. 00000 - “无法将NULL插入(%s)”
"HR"."EMPLOYEES"."EMPLOYEE_ID"
是主键。
我不知道为什么oracle不接受我的参赛作品。我尝试通过执行基本插入来检查表达式中是否存在语法错误:
INSERT INTO EMPLOYEES(INCREASE2)
VALUES ('whatever');
我仍然得到错误。
我尝试将列修改为不为空
ALTER TABLE EMPLOYEES
MODIFY
(INCREASE2 NUMBER(6) NOT NULL);
和
02296 00000 - “无法启用(%s。%s) - 找到空值”
*原因:alter table enable约会失败,因为表
包含不满足约束的值 *行动:明显的
我找到了一个简单的练习解决方案,但我仍然很好奇为什么我的代码没有成功。
分辨率:
SELECT employee_id, last_name, salary,
ROUND(salary * 1.155, 0) "New Salary",
ROUND(salary * 1.155, 0) - salary "Increase"
FROM employees;
答案 0 :(得分:3)
您的代码未成功,因为列employees.employee_id
是一个非空字段,没有默认值。当你跑:
INSERT INTO EMPLOYEES(INCREASE2)
VALUES ('whatever');
Employees
中所有其他字段的值均为默认值,如果不存在默认值,则为NULL
。因为这违反了约束,所以会出错。
通常,像employee_id
这样的字段将被分配给序列。这将自动为每个新记录插入一个自动递增的值。
答案 1 :(得分:1)
这不是更新,不是插入吗?在填充刚刚添加的新列的上下文中,插入新记录对我来说毫无意义。
update employees
set increase2 = ROUND(salary * 1.155, 0) - salary;
答案 2 :(得分:1)
我认为您错过了以下任务:“修改您的查询以添加一个从新工资中减去旧工资的列。标记列增加。运行修订的查询强>“。
所以你的最后决议应该没问题,你不必改变实际的表格。
答案 3 :(得分:0)
使用NOVALIDATE子句可以克服此错误ORA-02296 我尝试将表数据类型NULL修改为NOT NULL,使用表的NOVALIDATE后,它给出了错误。see code for more information
alter table emp11 modify eid not null novalidate;