我是数据库中的新手,我在尝试实现插入查询时遇到以下问题,该查询在名为 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
答案 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使用一些默认值,你需要在创建表时定义。