为什么这个简单的插入查询在Oracle数据库上无法工作?

时间:2015-05-20 09:54:59

标签: sql oracle oracle11g insert oracle-sqldeveloper

我是数据库中的新手,我在尝试实现插入查询时遇到以下问题,该查询在名为 CODA_RX 的表中创建了具有以下结构的表(通过执行描述CODA_RX 声明获得:

Name                          Null     Type           
----------------------------- -------- -------------- 
PK_CODA                       NOT NULL NUMBER(10)     
FK_TIPO_DOC                            NUMBER(4)      
FK_PIVA_DESTINATARIO                   VARCHAR2(16)   
FK_CDZZ                                VARCHAR2(4)    
DATA_IN                                DATE           
DATA_OUT                               DATE           
NUM_DOC                                VARCHAR2(35)   
FK_STATO                      NOT NULL NUMBER(2)      
CANALE                                 VARCHAR2(3)    
SIZE_XML                               NUMBER(10)     
FK_PIVA_MITTENTE                       VARCHAR2(20)   
INDIRIZZAMENTO                         VARCHAR2(100)  
SEGNALAZIONE                           VARCHAR2(4000) 
FORNITORE                              VARCHAR2(100)  
MATRICOLA_VERIFICATORE                 VARCHAR2(16)   
MATRICOLA_APPROVATORE                  VARCHAR2(16)   
DATA_INSERIMENTO_VERIFICATORE          DATE           
DATA_LAVORAZIONE_APPROVATORE           DATE           
MOTIVO_RIFIUTO                         VARCHAR2(1000) 
TOT_FATTURA                            NUMBER(10,2)   
DATA_DOC                               DATE           
DATA_SCADENZA_DOC                      DATE           
CIG                                    VARCHAR2(10)   
CUP                                    VARCHAR2(15)

好吧,似乎唯一不能 NULL 的2个字段是 PK_CODA (我认为是表的主键,是不是?我该怎么检查?)和 FK_STATO 字段。

所以我想在此表中插入一条新记录。如果 PK_CODA 主键,我认为它应该由Oracle自动生成。

所以我尝试执行此声明,只插入 FK_STATO 字段的新记录设置:

insert into CODA_RX (FK_STATO) values (2);

但问题是我收到此错误消息:

  

Errore con inizio alla riga 5 nel comando:插入CODA_RX   (FK_STATO)值(2)报告错误:错误SQL:ORA-01400:不能   将NULL插入(“EDIADD”。“CODA_RX”。“PK_CODA”)   01400. 00000 - “无法将NULL插入(%s)”   *原因:
  *操作:

所以似乎 PK_CODA 字段不能为空,这意味着当我尝试在表中插入新记录时它不会自动生成?或者我的插入查询中还有一些其他语法错误?我错过了什么?

TNX

3 个答案:

答案 0 :(得分:6)

主键不能为NULL。

不,它不是自动生成的。如果您习惯使用SQL Server或postgresql,这可能很奇怪。但是你必须问一个序列的值。看看这里:How to create id with AUTO_INCREMENT on Oracle?

答案 1 :(得分:1)

  

插入CODA_RX(FK_STATO)值(2);

上面的insert语句将插入一个具有FK_STATO列的单个值的行,但是,它将为其余列插入NULL值。

您无法在主键列中插入NULL值。这就是您看到PK_CODA列的NOT NULL约束的原因。

如果您想为每个插页自动填充主键,那么您需要使用:

因为你是11g,你需要使用触发序列方法。

例如,

表格

SQL> CREATE TABLE t (
  2    ID           NUMBER(10)    NOT NULL,
  3    text  VARCHAR2(50)  NOT NULL);

Table created.

SQL>

PRIMARY KEY 将由序列填充:

SQL> ALTER TABLE t ADD (
  2    CONSTRAINT id_pk PRIMARY KEY (ID));

Table altered.

SQL>

SEQUENCE 支持主键:

SQL> CREATE SEQUENCE t_seq
  2  START WITH 1000
  3  INCREMENT BY 1;

Sequence created.

SQL>

TRIGGER

如果您不想在INSERT中输入序列,可以通过TRIGGER自动执行。

SQL> CREATE OR REPLACE TRIGGER t_trg
  2  BEFORE INSERT ON t
  3  FOR EACH ROW
  4  WHEN (new.id IS NULL)
  5  BEGIN
  6    SELECT t_seq.NEXTVAL
  7    INTO   :new.id
  8    FROM   dual;
  9  END;
 10  /

Trigger created.

SQL>

插入

SQL> INSERT INTO t(text) VALUES('auto-increment test 1');

1 row created.

SQL> INSERT INTO t(text) VALUES('auto-increment test 2');

1 row created.

SQL>

让我们看看我们是否有ID列自动递增所需的值 -

SQL> SELECT * FROM t;

   ID TEXT
----- --------------------------------------------------
 1000 auto-increment test 1
 1001 auto-increment test 2

SQL>

因此,ID列现在值1000开头, 1递增,后续插入。

答案 2 :(得分:0)

如果您使用PK_CODA序列,那么sql应该是 插入CODA_RX(PK_CODA,FK_STATO)值(PK_CODA_seq.nextval,2);

否则,如果你想为PK_CODA使用一些默认值,你需要在创建表时定义。​​