Oracle SQL Developer中无法插入数据的问题求助
问题描述
我使用以下代码创建了数据表:
CREATE TABLE GLASACKO_MESTO( "ID_glasackog_mesta" NUMBER(10, 0) PRIMARY KEY, "Broj_registrovanih_biraca" NUMBER NOT NULL, "Broj_glasackog_mesta" NUMBER NOT NULL, "Izborna_jedinica" NUMBER NOT NULL ); CREATE INDEX GLASACKO_MESTO_BROJ_REG_B ON GLASACKO_MESTO("Broj_registrovanih_biraca");
同时创建了序列和触发器:
CREATE SEQUENCE "GLASACKO_MESTO_ID_SEQ" MINVALUE 1 MAXVALUE 9999999999 INCREMENT BY 1 START WITH 101 CACHE 5 NOORDER NOCYCLE; CREATE OR REPLACE TRIGGER "GLASACKO_MESTO_AUTO_PK" BEFORE INSERT ON GLASACKO_MESTO FOR EACH ROW BEGIN :NEW."ID_glasackog_mesta" := GLASACKO_MESTO_ID_SEQ.NEXTVAL; END;
所有对象创建成功,但执行以下INSERT语句时出现错误:
INSERT INTO GLASACKO_MESTO(Broj_registrovanih_biraca,Broj_glasackog_mesta,Izborna_jedinica) values ('2','3','4');
我也尝试手动指定ID:
INSERT INTO GLASACKO_MESTO(ID_glasackog_mesta,Broj_registrovanih_biraca,Broj_glasackog_mesta,Izborna_jedinica) values (1,'2','3','4');
但问题依旧,请问该如何解决?
解决方法
核心原因
建表时使用了带双引号的列名,Oracle会将这类标识符视为区分大小写的。而INSERT语句里的列名未加引号,Oracle会自动将其转换为大写,导致与表中实际的大小写列名不匹配,进而报错。
修复方案
方案一:修改INSERT语句匹配列名大小写
给INSERT语句中的列名加上双引号,保持和建表时的大小写一致:
- 自动生成ID的写法:
INSERT INTO GLASACKO_MESTO("Broj_registrovanih_biraca","Broj_glasackog_mesta","Izborna_jedinica") values ('2','3','4');
- 手动指定ID的写法:
INSERT INTO GLASACKO_MESTO("ID_glasackog_mesta","Broj_registrovanih_biraca","Broj_glasackog_mesta","Izborna_jedinica") values (1,'2','3','4');
方案二:重建表避免区分大小写标识符
如果不想后续操作都处理大小写问题,建议重建表时去掉列名的双引号,Oracle会默认将标识符转为大写,后续操作无需加引号:
CREATE TABLE GLASACKO_MESTO( ID_GLASACKOG_MESTA NUMBER(10, 0) PRIMARY KEY, BROJ_REGISTROVANIH_BIRACA NUMBER NOT NULL, BROJ_GLASACKOG_MESTA NUMBER NOT NULL, IZBORNA_JEDINICA NUMBER NOT NULL ); CREATE INDEX GLASACKO_MESTO_BROJ_REG_B ON GLASACKO_MESTO(BROJ_REGISTROVANIH_BIRACA); CREATE SEQUENCE GLASACKO_MESTO_ID_SEQ MINVALUE 1 MAXVALUE 9999999999 INCREMENT BY 1 START WITH 101 CACHE 5 NOORDER NOCYCLE; CREATE OR REPLACE TRIGGER GLASACKO_MESTO_AUTO_PK BEFORE INSERT ON GLASACKO_MESTO FOR EACH ROW BEGIN :NEW.ID_GLASACKOG_MESTA := GLASACKO_MESTO_ID_SEQ.NEXTVAL; END;
之后的INSERT语句直接使用无引号的列名即可:
INSERT INTO GLASACKO_MESTO(BROJ_REGISTROVANIH_BIRACA,BROJ_GLASACKOG_MESTA,IZBORNA_JEDINICA) values ('2','3','4');
内容的提问来源于stack exchange,提问作者deutschah
相关产品推荐
相关产品推荐

