为什么我收到此错误?
在表DDL中,我只有2列,id(数字)和名称(varchar)
ALTER TABLE mytable ADD SUSPEND date NOT NULL
ORA-01758:表必须为空才能添加强制(NOT NULL)列 ORA-06512:第7行
答案 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”列。 如果需要相同,则为列设置默认值或截断表,然后尝试。