2013-11-16 4 views
0

Я использую SQL Developer (с Oracle XE), чтобы установить 3 таблицы и добавить PK, FK .. Теперь я хочу добавить несколько строк ...Как установить FK во время вставки строки в SQL разработчика

INSERT INTO "ADMIN"."POST" (NAME_POST) VALUES ('asd') 

ORA-02291: integrity constraint (ADMIN.POST_DEPARTMENT_FK1) violated - parent key not found 
ORA-06512: at line 1 

Я не знаю, где я могу найти это FK, чтобы выбрать один! С SQL Developer я заполняю столбцы без FK, поэтому мне нужна помощь, чтобы найти, как это сделать правильно, используя SQLDeveloper.


Новая информация:

Я не знаю, почему, но у меня есть отношение один-к-одному между ДЕПАРТАМЕНТА и POST.

CREATE TABLE "ADMIN"."POST" 
    ( "ID_POST" NUMBER(*,0) NOT NULL ENABLE, 
    "NAME_POST" VARCHAR2(40 BYTE) NOT NULL ENABLE, 
    CONSTRAINT "POST_PK" PRIMARY KEY ("ID_POST") 
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
    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 "SYSTEM" ENABLE, 
    CONSTRAINT "POST_DEPARTMENT_FK1" FOREIGN KEY ("ID_POST") 
     REFERENCES "ADMIN"."DEPARTMENT" ("ID_DEPARTMENT") ON DELETE CASCADE ENABLE 
    ) 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 "SYSTEM" ; 

    CREATE OR REPLACE TRIGGER "ADMIN"."POST_ID" 
BEFORE INSERT ON POST 
REFERENCING NEW AS NEW 
FOR EACH ROW 
BEGIN 
    if(:new.ID_POST is null) then 
    SELECT S_POST.nextval 
    INTO :new.ID_POST 
    FROM dual; 
    end if; 
END; 
/
ALTER TRIGGER "ADMIN"."POST_ID" ENABLE; 
+1

Сначала необходимо вставить запись с родительским ключом. Вот как работают внешние ключи: запись не может быть вставлена ​​в таблицу, когда значение внешнего ключа не существует в ссылочной таблице. – krokodilko

+0

Извините, но это не главное. У меня есть несколько строк с Departments, поэтому у меня есть ключи. Но где я могу найти его при вставке? Если я вставляю новые данные в таблицу Post, я ничего не вижу о fk .. о том, как «получить столбец fk при вставке данных в SQL Developer», а не о том, «что означает эта ошибка?» Спасибо. – Khronos

+0

Взгляните на примеры здесь с предложением «возврат»: http://psoug.org/reference/insert.html Вставьте в основную таблицу, возвращая pk в переменную. Затем используйте эту переменную как часть вставки в дочернюю таблицу. Или, если запись уже существует в главной таблице, сначала выполните поиск. – Glenn

ответ

0

и пост у FK CONSTRAINT "POST_DEPARTMENT_FK1" FOREIGN KEY ("ID_POST") ЛИТЕРАТУРЫ "ADMIN". "УПРАВЛЕНИЕ" ("ID_DEPARTMENT") ON DELETE CASCADE ВКЛЮЧИТЬ

Ну , есть твоя проблема. У вас есть поле id_post, которое, как мы надеемся, является основным ключом таблицы post, и триггер поддерживает это. Но вы также сделали тот же столбец внешний ключ к таблице отдела. Делая это, вы создали отношения «один-к-одному». Это не сработает - триггер присваивает новое значение post_id из своей последовательности, и это было бы просто случайностью, если в таблице department был ПК с таким же значением.

Предполагая, что ваш post таблица также имеет id_department столбец, то FK должно быть:

CONSTRAINT "POST_DEPARTMENT_FK1" 
FOREIGN KEY ("ID_DEPARTMENT") 
REFERENCES "ADMIN"."DEPARTMENT" ("ID_DEPARTMENT") 
ON DELETE CASCADE ENABLE 

Похоже, вы также сказать, что SQL Developer не показывает вам столбец FK, department_id, в редактор данных. Единственный способ увидеть, что это так, - это открыть окно таблицы, прежде чем добавить этот столбец с помощью команды alter. Представление таблицы не обновляется автоматически, если изменяется определение таблицы. Закройте таблицу и откройте ее, и вы увидите текущую структуру, включая столбец FK.


ОК, из вашего вопроса редактирования, вы не имеете столбец для хранения department_id, что вы хотите быть FK. Вы должны включить этот столбец, и сделать это в FK:

CREATE TABLE "ADMIN"."POST" 
    ( "ID_POST" NUMBER(*,0) NOT NULL ENABLE, 
    "NAME_POST" VARCHAR2(40 BYTE) NOT NULL ENABLE, 
    "ID_DEPARTMENT" NUMBER(*,0) NOT NULL, 
    CONSTRAINT "POST_PK" PRIMARY KEY ("ID_POST") 
    USING INDEX ... 
    TABLESPACE "SYSTEM" ENABLE, 
    CONSTRAINT "POST_DEPARTMENT_FK1" FOREIGN KEY ("ID_DEPARTMENT") 
     REFERENCES "ADMIN"."DEPARTMENT" ("ID_DEPARTMENT") 
     ON DELETE CASCADE ENABLE 
    ) ... 
) 
    TABLESPACE "SYSTEM" ; 

Не хорошая идея, чтобы поставить свои собственные объекты в SYSTEM табличного хотя; создайте новый для объектов ADMIN.

Если у вас еще нет данных, будет проще всего сбросить и воссоздать таблицу. В противном случае вы можете использовать команды alter table, чтобы добавить столбец, и сбросить и воссоздать ограничение.

+0

действительно! Thx, теперь я понял. Но разработчик SQL не позволяет мне изменять его. O_o плохо добавить изображение этого. – Khronos

+0

О, хорошо, и у меня уже исправлено это, когда я спрашиваю) SYSTEM - генный код, idk, как он генерирует все еще. Но ты отлично справляешься со мной. Большое спасибо. – Khronos

+0

@Khronos - если вы не указали табличное пространство при создании таблицы, оно будет использовать табличное пространство пользователя по умолчанию. Если вы создадите новое табличное пространство, которое я бы рекомендовал, также измените пользователя на изменение значения по умолчанию, которое будет применяться и к индексам. Думаю, код, который вы показали, это DDL, который он показывает вам, а не то, что вы на самом деле набрали? Думал, что было немного странно, чтобы хранилище было указано ... –