第1行的错误:ORA-01400:无法插入NULL(“RGAKHAR”。“VEHICLE”。“VEHICLE_ID”)

时间:2017-01-13 11:49:40

标签: sql oracle

我是Oracle新手,希望获得以下帮助:

  • 我创建了一个名为Vehicle的表,该表由2个表中的数据填充:Rentals(主表)和Configuration

  • 当我尝试通过从表格中选择数据来为config_id插入值时发现错误

  • 错误说不能接受Vehicle_Id中的空值(没有任何空值)

*注意:Rentals表中的Vehicle_Id由序列

生成
create table configuration
(config_id int not null,
SEAT NUMBER(2),
2    3    4  DOORS NUMBER(2),
5  LARGE_BAGS NUMBER(2),
SMALL_BAGS NUMBER(2),
Vehicle_Type Varchar2(25),
primary key(config_id));
6    7    8

Table created.

SQL> SQL>
create sequence config_seq start with 1 increment by 1 nocache;

SQL>
Sequence created.

SQL> SQL>
SQL> insert into configuration (seat,doors,large_bags,small_bags,vehicle_type,config_id)
select x.seat,x.doors,x.large_bags,x.small_bags,x.vehicle_type,config_seq.nextval from (select distinct seat,doors,large_bags,small_bags,vehicle_type from rentals) x;

2 3

12 rows created.

SQL> SQL> SQL> create table Vehicle
(VEHICLE_ID int,
VEHICLE VARCHAR2(25) NOT NULL,
2    3    4  RENTAL_COMMENT CHAR(20),
5  COMPANY_ID int,
config_id int,
Primary key(VEHICLE_ID),
6    7    8  foreign key(company_id) references company(company_id),
9  foreign key(config_id) references configuration(config_id) on delete cascade);

Table created.

SQL>
SQL> insert into Vehicle (vehicle_id,vehicle,rental_comment,company_id)
select vehicle_id,vehicle,rental_comment,company_id from rentals;   2

20 rows created.

SQL> insert into vehicle(config_id) select config_id from configuration;
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("RGAKHAR"."VEHICLE"."VEHICLE_ID")

4 个答案:

答案 0 :(得分:2)

你对这个错误有什么看法?您已将vehicle.vehicle定义为NOT NULL。您的insert看起来像是:

insert into vehicle(config_id)
    select config_id from configuration;

列的默认值为NULL,不允许这样做。你有三个选择:

  • insert
  • 中指定一个值
  • 声明列,使其接受NULL值。
  • 为列提供default值。

您可能希望更新现有行。如果是这样,您应该只是正确插入数据。以下是你想要的可能性:

insert into Vehicle (vehicle_id, vehicle, rental_comment, company_id, config_id)
    select r.vehicle_id, r.vehicle, r.rental_comment, r.company_id,
           c.config_id
    from rentals r join
         configuration c
         on r.vehicle_type = c.vehicle_type;  -- just a guess

答案 1 :(得分:0)

未从配置中获取config_id请确认,并且NOT NULL表中的vehicle列也是如此:

因此,您可以使config_id可以为空,或者在插入以下语句时提供任何默认值:

insert into vehicle(config_id) select config_id from configuration;

答案 2 :(得分:0)

您的工作表车辆没有空列VEHICLE。使用

插入数据时

SQL>插入车辆(config_id)从配置中选择config_id;

您没有提供非空的所有字段。

您需要在第一次输入时插入config_id,或使用UPDATE查询来填充config_id

答案 3 :(得分:0)

在底部的说明中,您说:

  

租赁表中的Vehicle_Id由序列

生成

我认为这是问题所在。您认为vehicle_id应该自动填充,为什么Oracle会为此列抱怨null

您使用的词语表明您不太了解它是如何烹饪的。序列不会为您的列生成值,它只会生成一个数字。它不知道它的用途。如果在表中插入新行时需要使用这样的数字,则必须仍然明确说明。

insert into vehicle ( vehicle_id, config_id ) select seq_name.nextval, config_id 
                                              from   configuration

然而:您仍然会遇到问题,因为列vehicle也被声明为NOT NULL。您也必须为此提供值,否则您将获得有关其他列的相同错误。如何解决这个问题取决于您的业务需求。 (也许该列首​​先不需要为非空。)