date not null,error ora_01758

时间:2013-06-14 12:18:46

标签: oracle

为什么我收到此错误?
在表DDL中,我只有2列,id(数字)和名称(varchar)

  

ALTER TABLE mytable ADD SUSPEND date NOT NULL


  

ORA-01758:表必须为空才能添加强制(NOT NULL)列   ORA-06512:第7行

4 个答案:

答案 0 :(得分:5)

  

ORA-01758:表必须为空以添加必需(NOT NULL)列ORA-06512:第7行

你的桌子是空的吗?我想不是。

可能有一种解决方法,包括将列添加为可空,然后使用非NULL值填充每一行,将列更改为not null

或者,由于问题是这些当前行将被赋予NULL作为默认值,并且该列不允许为NULL,您也可以使用默认值来绕过它。来自Oracle docs

  

但是,如果给出默认值,则可以将具有NOT NULL约束的列添加到现有表中;否则,执行ALTER TABLE语句时抛出异常。

这是一个fiddle,你怎么做呢

答案 1 :(得分:2)

如果您尝试向表中添加新的Not NULL列,则会收到以下错误:

ORA-01758:表必须为空才能添加强制(NOT NULL)列

由于新列中的值为null(毕竟,您刚刚添加了列),因此无法满足新约束。

有三种方法可以克服ORA-01758:

1)为列提供默认值。

ALTER TABLE table-name ADD column-name VARCHAR2(15)DEFAULT'X'NOT NULL

如果您不想使用默认值,则可以在使用新数据填充列后将其删除。

2)添加没有NOT NULL约束的列

ALTER TABLE table-name ADD(column-name VARCHAR2(15));

- 添加数据

UPDATE table-name set column-name ='x';

- 应用NOT NULL约束。

ALTER TABLE表名MODIFY(列名NOT NULL)

3)清空表格,应用NOT NULL并将数据添加回表格

答案 2 :(得分:1)

未来的日期是否可以作为临时违约接受?如果是这样,这将有效:

ALTER TABLE MYTABLE ADD(SUSPEND_DATE DATE DEFAULT(TO_DATE('21000101','YYYYMMDD))
CONSTRAINT SUSPEND_DATE_NOT_NULL NOT NULL);

答案 3 :(得分:0)

如果表已包含记录,那么表将不允许添加“Not null”列。 如果需要相同,则为列设置默认值或截断表,然后尝试。