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

时间:2018-01-13 21:02:29

标签: 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: 关于如何做的任何想法?

3 个答案:

答案 0 :(得分:1)

INSERT添加行,而不是列。因此,您的insert语句会尝试从表中的现有行生成一组新行。它失败了,因为这些新行只填充username列,但显然至少有一个其他表列为null;因为您没有填充任何强制列,插入失败并显示ORA-01400: cannot insert NULL into ...

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

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)

然而,这可能无法给出独特的结果(如果需要,则不要说)

答案 1 :(得分:0)

  

获取理由 ORA-01400

     

您似乎正在尝试为未列出的INSERT空值   USERNAME语句的列(CUSTOMER表的not null列以外的列),   其中至少有一个是用INSERT约束定义的。

     

     

CUSTOMER表下有一个null触发器,它会尝试为任意定义的not null列插入VIEW值   表

我建议你创建一个CUSTOMERS_NICK_NAME来保存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; ,而不是通过创建表来多路复用数据,并在需要客户信息时查询此视图:

NSSplitViewController

答案 2 :(得分:0)

您正在获取ORA-01400,因为您尝试将空值插入非空列。以下语句使customer.username列可为空:

alter table
   customer
modify
   (username NULL);