繁体   English   中英

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

[英]Oracle SQL Updating a NOT NULL column with an empty string

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

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会抱怨null值。

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)

Oracle无法区分空字符串和空值。 它为它们使用相同的标记(一个零字节)。

您是否尝试过使用' ' (带有一个空格的字符串)? 如果varchar,我相信比较(对于大多数情况,即你没有指定比较白色字符)按预期工作。

我的意思是' ' = ' ' (单个和双个空格)应该对varchar字段求值为true

(我没有Oracle的实例,所以我不能确定...)

如果你有一个NOT NULL列并且你要将它更新为NULL,那么你可能需要考虑你的应用程序中的逻辑。 否则,您可以定义一个nvl(column,some_pattern),例如'???' (当然,取决于列的长度)对于未知的空数据,当您知道不允许插入/更新NULL时。

比你有什么要检查以查看某些东西是否表现不正确,或者在视图或其他东西中过滤掉这三个问号并再次显示为NULL。

你的id不是null,你想把它变为null你可以将你的所有表行插入到另一个表中作为备份,然后删除你的表并使用null able id行再次创建它并再次从备份中插入你的行,如果你使用的话您的ID作为主键,它将不再为null

另一种方法是在更新中使用'',它只返回空格,但它不是空的

CREATE TABLE BACKUP(
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));

INSERT INTO BACKUP (SELECT * FROM YourTable);

ALTER TABLE YourTable(
ID                             NUMBER(16),         
CHANNEL_STATUS_KEY    NOT NULL VARCHAR2(64 CHAR),  
REGISTERED_ADDRESS_ID NOT NULL NUMBER(16),         
VENDOR_ID             NOT NULL VARCHAR2(64 CHAR));

INSERT INTO YourTable (SELECT * FROM BACKUP);

现在使用您的查询

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM