2016-09-05 6 views
-1

У меня есть эта таблица в моем sgbd oracle 11g.ошибка oracle: добавьте первичный ключ

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: cannot validate (BMT.DIM_CLIENT_PK) - primary key violated.

+0

Покажите нам SQL, который вы используете для добавления первичного ключа. У вашего оператора CREATE TABLE нет его. –

+0

Существует дубликат данных для любых столбцов (ов), которые вы пытаетесь создать первичный ключ. Что вы ожидали? – sstan

ответ

0

Как Вы добавляете первичный ключ стол. Пожалуйста, см. Ниже, я не получил никаких проблем, когда я добавил его. Надеюсь, я правильно понял ваш запрос или вы хотели достичь чего-то другого.

Чтобы проиллюстрировать, что сказал @sstan, я покажу вам одну демоверсию. Надеюсь, это прояснит ваши сомнения.

Я создал таблицу без каких-либо ПК.

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', '[email protected]', 'EEEE'); 
Insert into DIM_CLIENT (ID_DIM_CLIENT, NOMCOMPLET_CLT, ADRESSE_CLT, NUM_TEL, EMAIL_CLT, TYPE_CLT) 
Values (1, 'BBB', 'CCC', 'DDD', '[email protected]', 'FFF'); 
Insert into DIM_CLIENT (ID_DIM_CLIENT, NOMCOMPLET_CLT, ADRESSE_CLT, NUM_TEL, EMAIL_CLT, TYPE_CLT) 
Values (1, 'CCC', 'DDD', 'EEE', '[email protected]', '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 не позволяет дублировать.

+0

, когда я это делаю: alter table DIM_CLIENT добавить первичный ключ ID_DIM_CLIENT –

+0

Повторите попытку. Это очистит ваше сомнение – XING

+0

благодарю вас. Когда я сделаю этот запрос: - измените таблицу DIM_PRST ограничение на падение DIM_PRST_PK; создать индекс IND_DIM_PRST на DIM_PRST (ID_DIM_PRST); ALTER TABLE BMT.DIM_PRST ADD CONSTRAINT DIM_PRST_PK ПЕРВИЧНЫЙ КЛЮЧ (ID_DIM_PRST) ENABLE NOVALIDATE; добавляется первичный ключ –

0

Выполнить этот запрос:

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

Если он возвращает все строки, вы не можете добавить первичный ключ на ID_DIM_CLIENT.

Смежные вопросы