ORA 01400和ORA 02296:无法插入null或将添加的列属性修改为NOT NULL

时间:2013-12-28 17:22:44

标签: oracle ddl notnull

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

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

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"是主键。

  1. 我不是要插入NULL值;
  2. 我不知道为什么oracle不接受我的参赛作品。我尝试通过执行基本插入来检查表达式中是否存在语法错误:

    INSERT INTO EMPLOYEES(INCREASE2)
    VALUES ('whatever');
    
  3. 我仍然得到错误。

    我尝试将列修改为不为空

    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 个答案:

答案 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;