oracle错误:添加主键

时间:2016-09-05 15:24:31

标签: sql oracle11g

我在我的sgbd oracle 11g中有这个表。

enter image description here

这是我的请求sql:

 CREATE TABLE "BMT"."DIM_CLIENT" (
    "ID_DIM_CLIENT" NUMBER(*,0) NOT NULL ENABLE, 
    "NOMCOMPLET_CLT" VARCHAR2(40 BYTE), 
    "ADRESSE_CLT" VARCHAR2(20 BYTE), 
    "NUM_TEL" VARCHAR2(20 BYTE), 
    "EMAIL_CLT" VARCHAR2(50 BYTE), 
    "TYPE_CLT" VARCHAR2(50 BYTE)
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;

当我添加主键时,我收到此错误:

  

ORA-02437:无法验证(BMT.DIM_CLIENT_PK) - 违反了主键。

2 个答案:

答案 0 :(得分:0)

如何将主键添加到表中。请看下面,我添加它时没有遇到任何问题。我希望我能正确理解你的查询,或者你想要实现其他目标。

为了说明@sstan所说的内容,我向您展示了一个演示。我希望这能澄清你的疑虑。

我创建了一个没有任何PK的表。

CREATE TABLE DIM_CLIENT (
    ID_DIM_CLIENT NUMBER(*,0) NOT NULL ENABLE , 
    NOMCOMPLET_CLT VARCHAR2(40 BYTE), 
    ADRESSE_CLT VARCHAR2(20 BYTE), 
    NUM_TEL VARCHAR2(20 BYTE), 
    EMAIL_CLT VARCHAR2(50 BYTE), 
    TYPE_CLT VARCHAR2(50 BYTE)
   );

然后我插入了以下记录集:

Insert into DIM_CLIENT (ID_DIM_CLIENT, NOMCOMPLET_CLT, ADRESSE_CLT, NUM_TEL, EMAIL_CLT,  TYPE_CLT)
 Values  (1, 'AAA', 'BBB', 'CCC', 'DDD@DDD',   'EEEE');
Insert into DIM_CLIENT (ID_DIM_CLIENT, NOMCOMPLET_CLT, ADRESSE_CLT, NUM_TEL, EMAIL_CLT,  TYPE_CLT)
 Values  (1, 'BBB', 'CCC', 'DDD', 'EEE@DDD',    'FFF');
Insert into DIM_CLIENT (ID_DIM_CLIENT, NOMCOMPLET_CLT, ADRESSE_CLT, NUM_TEL, EMAIL_CLT,  TYPE_CLT)
 Values  (1, 'CCC', 'DDD', 'EEE', 'FFF@DDD',    'GGG');
COMMIT;

如果你看一下,我把ID_DIM_CLIENT的记录插入到表中,作为' 1'所有记录

现在我尝试将主键添加到表中:

alter table DIM_CLIENT add primary key (ID_DIM_CLIENT) ;

我得到错误:

SQL>  alter table DIM_CLIENT add primary key (ID_DIM_CLIENT) ;  
 alter table DIM_CLIENT add primary key (ID_DIM_CLIENT)
*
ERROR at line 1:
ORA-02437: cannot validate (T541682.SYS_C001225687) - primary key violated

我希望我的演示清楚地说明了问题所在。它是ID_DIM_CLIENT数据,在您尝试创建PK的现有表中是重复的。 PK不允许任何重复。

答案 1 :(得分:0)

执行此查询:

SELECT id_dim_client, COUNT(*)
FROM   bmt.dim_client
GROUP  BY id_dim_client
HAVING COUNT(*) > 1

如果它返回任何行,则无法在ID_DIM_CLIENT上添加主键。