从名字和姓氏的前4个字母Oracle SQL创建用户名属性

从名字和姓氏的前4个字母Oracle SQL创建用户名属性,sql,oracle,insert,substr,Sql,Oracle,Insert,Substr,我在Oracle中有一个Customer表,其中包含客户的名字和姓氏 我想创建一个名为“username”的新属性(列),它由名字的前4个字母和姓氏的前4个字母组成 我试过: INSERT INTO CUSTOMER(USERNAME) SELECT SUBSTR(CUSTOMER_LAST_NAME,0,4)||SUBSTR(CUSTOMER_FIRST_NAME,0,4) FROM CUSTOMER; 但不幸的是,我得到了这个错误:第1行的错误: ORA-01400: 关于如何操作有什么想

我在Oracle中有一个Customer表,其中包含客户的名字和姓氏

我想创建一个名为“username”的新属性(列),它由名字的前4个字母和姓氏的前4个字母组成

我试过:

INSERT INTO CUSTOMER(USERNAME)
SELECT SUBSTR(CUSTOMER_LAST_NAME,0,4)||SUBSTR(CUSTOMER_FIRST_NAME,0,4)
FROM CUSTOMER;
但不幸的是,我得到了这个错误:第1行的错误: ORA-01400:
关于如何操作有什么想法吗?

INSERT
添加行,而不是列。因此,insert语句尝试从表中的现有行生成一组新行。它失败了,因为这些新行只填充
username
列,但显然至少有一个表列为空;由于您没有填充任何必填列,因此插入失败,
ORA-01400:无法将NULL插入…

首先,您需要创建(空)列

ALTER TABLE customer
  ADD username VARCHAR2(8);  -- make sure YOU chose the correct data type for your needs.
然后您需要用您想要的值填充该列

UPDATE customer
  SET username = SUBSTR(CUSTOMER_LAST_NAME,0,4)||SUBSTR(CUSTOMER_FIRST_NAME,0,4)
但是,这可能不会给出唯一的结果(您不会说是否需要)

获取ORA-01400的原因

似乎您正在尝试
为未列出的对象插入
空值
INSERT
语句的列(除
CUSTOMER
表的
USERNAME
列以外的列), 其中至少有一个是使用
非空
约束定义的

CUSTOMER
表下有一个
INSERT
触发器,它尝试为任何 桌子

我建议您创建一个
视图
来保存您的
客户名称
,而不是通过创建一个表来复用数据,并在需要客户信息时查询此视图:

CREATE OR REPLACE VIEW V_CUSTOMER AS 
SELECT CUSTOMER_LAST_NAME, CUSTOMER_FIRST_NAME,
       SUBSTR(CUSTOMER_LAST_NAME,0,4)||SUBSTR(CUSTOMER_FIRST_NAME,0,4) CUSTOMER_NICK_NAME
  FROM CUSTOMER;

您之所以获得ORA-01400,是因为您试图在NOTNULL列中插入null值。以下语句使customer.username列可为空:

alter table
   customer
modify
   (username NULL);

请参阅有关如何表达您的问题的完整示例。它缺少任何模式,如果没有具体的东西,我们真的无法提供帮助。“不起作用”是任何人在提问中使用的最没有帮助的短语。包括准确和可复制的信息。你收到错误信息了吗?如果是的话,包括他们!它是否运行,但会产生意外的结果?如果是这样,请展示您的测试用例、您期望的结果以及您得到的结果。这不是火箭科学;我们不是心灵感应者!用户名通常不是唯一的吗?有多少个约翰斯米特
s可以吗?请发布CUSTOMER表的说明,显示哪些列是必需的(非空)。OP似乎正在向现有填充表中添加新列。因此,
用户名
必须已经可以为空:Oracle不允许我们将NOTNULL添加到填充的表中。实际上,有一种解决方法可以做到这一点。首先添加一个新列(不受约束),然后更改表并将用户名列修改为NOTNULL NOVALIDATE。现有记录将保留为空用户名,而新添加的记录必须具有某些值。