【问题标题】:Inserting data into table in Oracle 10gOracle 10g 向表中插入数据
【发布时间】:2011-11-04 20:44:42
【问题描述】:

我使用下面的脚本在oracle中创建了一个表

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

但是,当我插入以下 dat 时,它不起作用,因为其中 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;

有人知道怎么解决吗?

【问题讨论】:

  • 是的,不要插入重复项。你想要什么?
  • 这是一个 uni 项目,这是我必须插入的数据,但staff_level 是主键,谢谢罗斯
  • 如果是主键,则不能有重复项。
  • 主键可以有重复值,甚至可以是空值。在插入数据、使用 NOVALIDATE 并使用非唯一索引后,您必须创建或启用约束。但在 99.9% 的情况下,这样做可能是个坏主意。另见:stackoverflow.com/questions/7981221/…stackoverflow.com/questions/7993585/…(最近这个问题不断出现是巧合,还是你们都在同一个班?)

标签: oracle oracle10g


【解决方案1】:

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

它是否说STAFF_LEVEL 是主键中唯一的列?

您可以使用以下方法创建复合 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 必须是独一无二的。

厚颜无耻,如果您被要求列、数据(不是唯一的)和 PK 列,您可以创建表、主键并禁用 PK。它满足您项目的标准(并且对数据库的使用很糟糕),但会允许非唯一数据,同时“技术上”仍然有一个 PK 在表上(即使它被禁用)......

【讨论】:

    【解决方案2】:

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

    STAFF_LEVEL 看起来不应该是唯一的或用作主键。所以删除主键,你就可以插入行了。

    (下次请提供准确的错误信息。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 2015-12-19
      • 2014-09-14
      相关资源
      最近更新 更多