2017-08-01 247 views
-1

我想创建一个表,我得到的错误invalid datatype。我试图改变变量,但错误依然存在。有人能帮我吗?SQL创建表ORA-00902:无效的数据类型

代码:

CREATE TABLE DETALLEFACTURA (
    NUMERO_FACTURA_DETALLE NUMBER(15), 
    NUMERO_DETALLE_FACTURA VARCHAR(20), 
    CODIGO_ARTICULO VARCHAR(20), 
    CANTIDAD NUMBER(6), 
    PORCENTAJE_GANANCIA NUMBER(10), 
    PRECIO NUMBER(8), 
    CONSTRAINT DETALLE_PK PRIMARY KEY(NUMERO_FACTURA_DETALLE,NUMERO_DETALLE_FACTURA), 

    CONSTRAINT (NUMERO_FACTURA_DETALLE_FK) FOREIGN KEY(NUMERO_FACTURA_DETALLE) REFERENCES FACTURA(NUMERO_FACTURA) on delete cascade, 
    CONSTRAINT (NUMERO_DETALLE_FACTURA_FK) FOREIGN KEY(NUMERO_DETALLE_FACTURA) REFERENCES ARTICULO(CODIGO_ARTICULO) on delete cascade 
); 

错误

ORA-00902: invalid datatype 

感谢大家提前!

回答

1

错误来自约束名称周围的括号;这得到了同样的错误:

create table FACTURA(NUMERO_FACTURA NUMBER(15) primary key); 
create table ARTICULO(CODIGO_ARTICULO VARCHAR(20) primary key); 

CREATE TABLE DETALLEFACTURA(
NUMERO_FACTURA_DETALLE NUMBER(15), 
NUMERO_DETALLE_FACTURA VARCHAR(20), 
CODIGO_ARTICULO VARCHAR(20), 
CANTIDAD NUMBER(6), 
PORCENTAJE_GANANCIA NUMBER(10), 
PRECIO NUMBER(8), 
CONSTRAINT DETALLE_PK PRIMARY KEY(NUMERO_FACTURA_DETALLE,NUMERO_DETALLE_FACTURA), 
CONSTRAINT (NUMERO_FACTURA_DETALLE_FK) FOREIGN KEY(NUMERO_FACTURA_DETALLE) REFERENCES FACTURA(NUMERO_FACTURA) on delete cascade, 
CONSTRAINT (NUMERO_DETALLE_FACTURA_FK) FOREIGN KEY(NUMERO_DETALLE_FACTURA) REFERENCES ARTICULO(CODIGO_ARTICULO) on delete cascade 
); 

ORA-00902:无效的数据类型

这不:

CREATE TABLE DETALLEFACTURA(
NUMERO_FACTURA_DETALLE NUMBER(15), 
NUMERO_DETALLE_FACTURA VARCHAR(20), 
CODIGO_ARTICULO VARCHAR(20), 
CANTIDAD NUMBER(6), 
PORCENTAJE_GANANCIA NUMBER(10), 
PRECIO NUMBER(8), 
CONSTRAINT DETALLE_PK PRIMARY KEY(NUMERO_FACTURA_DETALLE,NUMERO_DETALLE_FACTURA), 
CONSTRAINT NUMERO_FACTURA_DETALLE_FK FOREIGN KEY(NUMERO_FACTURA_DETALLE) REFERENCES FACTURA(NUMERO_FACTURA) on delete cascade, 
CONSTRAINT NUMERO_DETALLE_FACTURA_FK FOREIGN KEY(NUMERO_DETALLE_FACTURA) REFERENCES ARTICULO(CODIGO_ARTICULO) on delete cascade 
); 

Table DETALLEFACTURA created. 

唯一的区别是在最后两个约束去除括号。


顺便提一下,Oracle recommends using varchar2 instead of varchar;它不会造成错误,但会造成混乱,最好在可以的时候遵循他们的建议。他们一直在说,只要我记得它会被重新定义,但是谁知道,它可能会发生一天...

+0

非常感谢Alex! – dansan

+0

关于你最后的评论(“这可能发生一天......”) - 我等不及了!就我所知,重新定义VARCHAR的主要原因与Oracle遵守SQL标准有关 - 特别是允许空字符串与NULL不同。 (与SQL标准和逻辑相反,空字符串和'NULL'在Oracle中是相同的。) – mathguy

+0

@mathguy自信地提供一个错误的答案,没有什么比这让自己感到尴尬。根据您的建议,我删除了以前的答案。 –