2

“修改您的查询以添加从新工资中减去旧工资的列。标记列增加。运行修改后的查询。”

好吧,根据我的解释,我首先尝试通过脚本添加列:

ALTER TABLE EMPLOYEES ADD (
    INCREASE2   NUMBER(6));

然后:

INSERT INTO EMPLOYEES(INCREASE2)
SELECT (salary*1.155) - salary FROM EMPLOYEES;

SQL 错误:ORA-01400:não é possível inserir NULL em ("HR"."EMPLOYEES"."EMPLOYEE_ID") 01400. 00000 - “无法将 NULL 插入 (%s)”

"HR"."EMPLOYEES"."EMPLOYEE_ID"是主键。

  1. 我不是要插入 NULL 值;
  2. 我不知道为什么 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;
4

4 回答 4

5

您的代码没有成功,因为该列employees.employee_id是一个没有默认值的非空字段。当你运行时:

INSERT INTO EMPLOYEES(INCREASE2)
    VALUES ('whatever');

中的所有其他字段的值Employees被分配默认值,或者NULL如果不存在默认值。因为这违反了约束,所以会出现错误。

通常,像这样的字段employee_id会被分配给一个序列。这将自动为每条新记录插入一个自动递增的值。

于 2013-12-28T17:38:21.893 回答
1

这不是更新,而不是插入吗?在填充您刚刚添加的新列的上下文中,插入新记录对我来说毫无意义。

update employees
set increase2 = ROUND(salary * 1.155, 0)  - salary;
于 2013-12-28T20:22:09.693 回答
1

我假设您误解了任务:“修改查询以添加从新工资中减去旧工资的列。标记列增加。运行修改后的查询。”

所以你的最后一个决议应该没问题,你不必改变实际的表格。

于 2013-12-28T20:30:37.257 回答
0

使用 NOVALIDATE 子句可以克服此错误 ORA-02296 我正在尝试将表数据类型 NULL 修改为 NOT NULL,它在使用 NOVALIDATE 表被更改后给出错误。查看代码以获取更多信息

alter table emp11 modify eid not null novalidate;
于 2020-01-13T11:14:15.107 回答