【问题标题】:ORA 01400 and ORA 02296 : Cannot insert null or modify added column properties to NOT NULLORA 01400 和 ORA 02296:无法插入 null 或将添加的列属性修改为 NOT NULL
【发布时间】:2014-01-16 00:35:36
【问题描述】:

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

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

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;

【问题讨论】:

    标签: oracle ddl notnull


    【解决方案1】:

    使用 NOVALIDATE 子句可以克服这个错误 ORA-02296 我正在尝试将表数据类型 NULL 修改为 NOT NULL,它在使用 NOVALIDATE 表被更改后给出错误。see code for more information

    alter table emp11 modify eid not null novalidate;
    

    【讨论】:

    • 我们喜欢在这里查看带有建议修改的代码。我邀请您阅读本指南以改进您的答案:“我如何写出一个好的答案”:stackoverflow.com/help/how-to-answer
    • 我们也喜欢回答最初发布的问题“为什么我的代码没有成功。?”。就像@Gordon Linoff 在接受的答案上所做的那样。此外,您的示例代码在您的答案中应该是纯文本,并且是原始问题代码的更新,而不是与它无关的示例。我的意思是在我们的例子中重复使用相同的表列。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      update employees
      set increase2 = ROUND(salary * 1.155, 0)  - salary;
      

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

        • 非常感谢戈登!你的解释澄清了我的这个问题和其他问题。谢谢!
        猜你喜欢
        • 1970-01-01
        • 2011-08-23
        • 2017-09-01
        • 2018-11-08
        • 2013-02-21
        • 2016-08-21
        • 2015-06-04
        • 2016-06-21
        • 1970-01-01
        相关资源
        最近更新 更多