在Oracle 10g中将数据插入表中

时间:2011-11-04 12:11:02

标签: oracle oracle10g

我使用以下脚本在oracle中创建表

CREATE TABLE  STAFF_LVL 
   (
    STAFF_LEVEL NUMBER(1,0), 
    MANAGER VARCHAR2(10), 
    OPERATOR VARCHAR2(10), 
    ENGINEER VARCHAR2(10), 
    PRIMARY KEY (STAFF_LEVEL) ENABLE
   );

但是,当我插入以下数据时,它不起作用,因为其中2行是相同的

BEGIN
insert into staff_lvl values (1,'N','N','Y');
insert into staff_lvl values (3,'N','Y','Y');
insert into staff_lvl values (7,'Y','Y','Y');
insert into staff_lvl values (3,'N','Y','Y');
END;

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

正如你所说的那样,这是一个单项目,你必须有STAFF_LEVEL作为主键......

是否说STAFF_LEVEL是PRLYARY KEY中的唯一列?

你可以用:

创建一个复合PK
CREATE TABLE  STAFF_LVL
 (
  STAFF_LEVEL NUMBER(1,0),
  MANAGER VARCHAR2(10),
  OPERATOR VARCHAR2(10),
  ENGINEER VARCHAR2(10),
  PRIMARY KEY (STAFF_LEVEL, MANAGER, OPERATOR, ENGINEER) ENABLE
); 

从而允许您输入两个STAFF_LEVEL值3,只要它们对其他列没有相同的值。 虽然你的数据仍然会引起问题。

你是否强制要求列?

您可以根据序列添加生成的PK列吗?

类似的东西:

CREATE TABLE  STAFF_LVL
 (
  ID NUMBER,
  STAFF_LEVEL NUMBER(1,0),
  MANAGER VARCHAR2(10),
  OPERATOR VARCHAR2(10),
  ENGINEER VARCHAR2(10),
  PRIMARY KEY (ID, STAFF_LEVEL) ENABLE
); 

CREATE SEQUENCE id_seq
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 1;

insert into staff_lvl values (id_seq.nextval, 1,'N','N','Y');
insert into staff_lvl values (id_seq.nextval, 3,'N','Y','Y');
insert into staff_lvl values (id_seq.nextval, 7,'Y','Y','Y');
insert into staff_lvl values (id_seq.nextval, 3,'N','Y','Y'); 

基本上,PK HAS是独一无二的。

要厚颜无耻,如果要求列,数据(不是唯一的)和PK列,您可以创建表,主键并禁用PK。它满足了你的项目的标准(并且可怕地使用了数据库)但是允许非独特的数据,而“技术上”仍然在桌面上有PK(即使它被禁用)......

答案 1 :(得分:0)

您已将STAFF_LEVEL声明为主键。这意味着您已要求数据库确保表中的所有行都具有STAFF_LEVEL的唯一值。但是,您尝试插入两个具有相同级别的不同行。这就是阻止你插入它的原因。

STAFF_LEVEL看起来不应该是唯一的或作为主键。因此,删除主键,您就可以插入行。

(下次请提供确切的错误消息。)