Oracle SQL:如何为Customer表创建基于姓名前4位的username字段?
解决Oracle中新增并填充USERNAME字段的问题
首先咱们先理清你遇到的ORA-01400: 无法将 NULL 插入("你的 schema"."CUSTOMER"."CUSTOMER_FIRST_NAME")错误的根源:你用了INSERT语句,这是往表中插入全新的客户记录,但这些新记录里没有提供CUSTOMER_FIRST_NAME、CUSTOMER_LAST_NAME这类必填字段的值(Oracle默认这类字段带有非空约束),所以数据库直接报错了。你真正要做的是给已有的客户记录填充新增的USERNAME字段,而不是插入新行。
正确的实现分两步走:
1. 先给Customer表新增USERNAME字段
如果还没添加这个字段,先执行这条SQL创建字段:
ALTER TABLE CUSTOMER ADD (USERNAME VARCHAR2(20)); -- 长度可按需调整,比如8位足够的话设为8即可
2. 更新现有记录的USERNAME值
用UPDATE语句替换你原来的INSERT,给每一行的USERNAME赋值:
UPDATE CUSTOMER SET USERNAME = SUBSTR(CUSTOMER_FIRST_NAME, 1, 4) || SUBSTR(CUSTOMER_LAST_NAME, 1, 4);
小提醒:Oracle的
SUBSTR函数起始索引是1而非0,你之前写的SUBSTR(...,0,4)虽然实际效果和SUBSTR(...,1,4)一样,但从规范角度更推荐用1作为起始索引。
如果部分客户的名或姓不足4个字符,SUBSTR会自动取到字符串末尾,拼接后的结果长度会小于8,这属于正常情况。
可选操作:给USERNAME添加非空约束(如果需要)
要是希望USERNAME字段不能为空,可以在填充完所有数据后添加约束:
ALTER TABLE CUSTOMER MODIFY (USERNAME NOT NULL);
内容的提问来源于stack exchange,提问作者Bill Manassas
相关产品推荐
相关产品推荐

