sql - Oracle SQL 使用空字符串更新 NOT NULL 列

标签 sql oracle

我在编写 SQL 更新语句时遇到问题,我需要用空字符串更新非空字段。

UPDATE channel_mgmt.channels
    SET registered_address_id=p_address_id
        ,vendor_id=p_spc_code
     WHERE id=v_channel_id;

在这种情况下,p_spc_code 可以设置为 '',当我运行这个时,我遇到了 SQL 错误:
Error report:
ORA-01407: cannot update ("CHANNEL_MGMT"."CHANNELS"."VENDOR_ID") to NULL
ORA-06512: at line 8973
 01407. 00000 -  "cannot update (%s) to NULL"
*Cause:    
*Action:

有什么想法可以解决这个问题吗?在某些情况下我需要使用空字符串,但我不确定 oracle 为什么会提示空值。
desc channel_mgmt.channels
Name                  Null     Type               
--------------------- -------- ------------------ 
ID                    NOT NULL NUMBER(16)         
CHANNEL_STATUS_KEY    NOT NULL VARCHAR2(64 CHAR)  
REGISTERED_ADDRESS_ID NOT NULL NUMBER(16)         
VENDOR_ID             NOT NULL VARCHAR2(64 CHAR)

最佳答案

如果有 NOT NULL在列上定义的约束不能通过指定 null 更新表或零长度字符串( '' )作为列的新值。 Oracle 将零长度字符串(当分配给 '' 列或变量时 varchar2)视为 NULL ,所以从oracle的角度来看,这两条语句是一样的set col_name = nullset col_name = '' .如果您想允许某列接受 NULL如果它会造成任何伤害,您需要从该列中删除非空约束:

alter table <<table_name>> modify (<<column_name>> [<<data type>>] null)

关于sql - Oracle SQL 使用空字符串更新 NOT NULL 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19211419/

相关文章:

oracle - 是否可以在 ORACLE 11g 中的父记录之前插入子记录?

java - 即使在 sql Developer 中启动相同的命令有效,为什么 resultSet next 不会从我的 Oracle SQL 数据库返回任何值?

MYSQL SELECT 行的总和超过 200

sql - 如何根据条件从 Oracle XMLTYPE 中删除节点?

oracle - 在oracle中创建表作为select语句主键

performance - Oracle Coherence 缓存和应用服务器的 CPU 使用率

sql - 具有大量连接的高级 SQL 查询

mysql - SQL:仅查询第二个表中有两行与其关联的结果

sql - 如何检测哪些存储过程更新或插入某个表?

sql - PostgreSQL 对同一个表的多个列进行计数