我在我的sgbd oracle 11g中有这个表。
这是我的请求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) - 违反了主键。
答案 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上添加主键。