从名字和姓氏的前4个字母Oracle SQL创建用户名属性
我在Oracle中有一个Customer表,其中包含客户的名字和姓氏 我想创建一个名为“username”的新属性(列),它由名字的前4个字母和姓氏的前4个字母组成 我试过:从名字和姓氏的前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: 关于如何操作有什么想
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。现有记录将保留为空用户名,而新添加的记录必须具有某些值。