【问题标题】:Getting ORA-00001 and ORA-01438 errors when inserting data into a table向表中插入数据时出现 ORA-00001 和 ORA-01438 错误
【发布时间】:2014-03-09 02:51:43
【问题描述】:

我在尝试运行此脚本时遇到问题:

ORA-00001:违反了唯一约束(constraint_name)

所以,问题是不能在表中插入日期,其他错误是:

ORA-01438: 该列允许的值大于指定的精度

CREATE TABLE TEST
(    TEST_ID        INT NOT NULL,
    COMPONENTS     VARCHAR2(30) NOT NULL,
    MATTER        VARCHAR2(2) NOT NULL,
    LIC            NUMBER(9, 2),
    MIC            NUMBER(9, 2),
    UIP            NUMBER(9, 2),
    CONSTRAINT TEST_pk PRIMARY KEY (TEST_ID));

--SEQUENCE TEST_ID

CREATE SEQUENCE SEQ_TEST_ID
 START WITH     1
 INCREMENT BY   1
 MINVALUE 1
 MAXVALUE 9999;

 --INSERTING VALUE TO TABLE

INSERT ALL

INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Food waste','OG','50.50','39.00','13.00')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Paper'     ,'OG','05.50','19.00','32.50')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Cardboard' ,'OG','00.00','00.00','10.00')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Plastic'       ,'OG','03.00','04.00','00.00')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Textiles'      ,'OG','03.00','06.00','04.00')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Ruber'     ,'OG','03.00','00.00','01.00')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Leather'       ,'OG','03.00','02.50','01.00')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Yard waste' ,'OG','00.00','00.00','15.00')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Wood'           ,'OG','03.00','05.50','02.50')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Misc. Organic','OG','03.00','04.00','00.00')

INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Glass'      ,'IG','05.50','05.50','08.00')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Tin Cans'       ,'IG','00.50','00.50','05.00')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Aluminum'       ,'IG','03.00','03.00','00.50')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Other metals'   ,'IG','00.00','00.00','02.50')
INTO TEST (TEST_ID,COMPONENTS, MATTER, LIC, MIC, UIP) VALUES (SEQ_TEST_ID.NEXTVAL,'Drit,ash,etc'   ,'IG','20.50','15.50','05.00')
SELECT * FROM DUAL;​

【问题讨论】:

  • 你使用什么oracle版本?
  • 好的太好了!!只是一个信息.. Oracle 12c 具有自动增量功能!
  • 感谢信息

标签: sql oracle oracle11g


【解决方案1】:

您可以将序列缓存大小增加到200,默认为20。

alter sequence SEQ_TEST_ID cache 200;

试试agian。

【讨论】:

    【解决方案2】:

    如果你在oracle中创建表,那么AUTO_INCREMENT是不支持的。

    使用MSW_ID 作为数字创建表,并创建一个序列以在表中使用它的值。

    CREATE TABLE MSW
    
    ( MSW_ID number, 
     COMPONENTS VARCHAR2(15) NOT NULL, 
     MATTER VARCHAR2(2) NOT NULL, 
     LIC NUMBER(4, 2), 
     MIC NUMBER(4, 2), 
     UIP NUMBER(4, 2), 
     CONSTRAINT NSW_pk PRIMARY KEY (MSW_ID));
    

    您可以了解更多关于序列的信息here

    CREATE SEQUENCE SEQ_MSW_ID
     START WITH     1
     INCREMENT BY   1
     MINVALUE 1
     MAXVALUE 99999999999;
    

    然后你插入查询就变成了

    INSERT  INTO MSW ( MSW_ID, COMPONENTS, MATTER, LIC, MIC, UIP) VALUES
                    (SEQ_MSW_ID.NEXTVAL, 'Food waste'   ,'OG','50.50','39.00','13.00'); --> semicolon
    INSERT  INTO MSW ( MSW_ID, COMPONENTS, MATTER, LIC, MIC, UIP) VALUES
                     (SEQ_MSW_ID.NEXTVAL, 'Paper'        ,'OG','05.50','19.00','32.50');  --> semicolon
    .
    .
    .
    INSERT  INTO MSW ( MSW_ID, COMPONENTS, MATTER, LIC, MIC, UIP) VALUES
                     (SEQ_MSW_ID.NEXTVAL, 'Drit,ash,etc' ,'IG','20.50','15.50','05.00');  --> semicolon
    

    或者使用 insert all 作为单个语句作为

    INSERT ALL 
         INTO MSW ( MSW_ID, COMPONENTS, MATTER, LIC, MIC, UIP) VALUES
                    (SEQ_MSW_ID.NEXTVAL, 'Food waste'   ,'OG','50.50','39.00','13.00')
         INTO MSW ( MSW_ID, COMPONENTS, MATTER, LIC, MIC, UIP) VALUES
                    (SEQ_MSW_ID.NEXTVAL, 'Paper'        ,'OG','05.50','19.00','32.50')
         .
         .
         .
         INTO MSW ( MSW_ID, COMPONENTS, MATTER, LIC, MIC, UIP) VALUES
                    (SEQ_MSW_ID.NEXTVAL, 'Drit,ash,etc' ,'IG','20.50','15.50','05.00')
    SELECT * FROM DUAL;  --> semicolon
    

    【讨论】:

    • 谢谢,但我仍然遇到同样的问题:S
    • 再次更新 POST
    • 谢谢,工作得很好,我现在遇到了 ORA-00917 的一个小问题:缺少逗号
    • 很可能遗漏了一些逗号,再次检查语法或分享实际代码。
    • 我检查了它,现在又得到一个错误 ora-00001,我到处查找,我找不到它
    【解决方案3】:

    错误消息是由于int() 中的额外括号造成的。

    SQL> create table foo(f int());
    create table foo(f int())
                          *
    ERROR at line 1:
    ORA-00907: missing right parenthesis
    
    
    SQL> create table foo(f int);
    
    Table created.
    
    SQL> 
    

    顺便说一句。这个问题与 PL/SQL 无关,这是一个普通的 Oracle SQL 问题。

    【讨论】:

    • OP 编辑​​了问题并修复了无效的表创建。
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2021-05-27
    • 2019-03-24
    • 2015-02-17
    相关资源
    最近更新 更多