[英]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 = null
和set 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.