Как обновить строки с тем же внешним ключом, не обновляя их все - PullRequest
0 голосов
/ 05 октября 2019

Я работаю над своим университетским проектом и мне нужна помощь по базе данных Oracle.

У меня есть две таблицы USERFORM и ACADEMICTRAINING.

USERFORM

Name           Null?    Type         
-------------- -------- ------------ 
USER_ID        NOT NULL NUMBER(5)    
FIRSTNAME      NOT NULL VARCHAR2(30) 
LASTNAME       NOT NULL VARCHAR2(30) 
EMAIL          NOT NULL VARCHAR2(60) 
BORN_DATE      NOT NULL DATE         
PHONE          NOT NULL VARCHAR2(20) 
ACCESSPASSWORD NOT NULL VARCHAR2(30) 

ACADEMICTRAINING

Name           Null?    Type          
-------------- -------- ------------- 
AT_ID          NOT NULL NUMBER(5)     
START_DATE     NOT NULL DATE          
END_DATE       NOT NULL DATE          
INSTITUTION    NOT NULL VARCHAR2(100) 
COURSE         NOT NULL VARCHAR2(70)  
AT_DESCRIPTION          VARCHAR2(200) 

AT_ID - это внешний ключ, который ссылается на USERFORM в столбце USER_ID.

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

Ответы [ 2 ]

0 голосов
/ 05 октября 2019

Ваша структура данных испорчена, что вас смущает. Почему вы называете user column AT_ID. Также внешние ключи не объявляются. Лучший подход:

CREATE TABLE ACADEMICTRAINING (
    USER_ID NUMBER(5) NOT NULL FOREIGN KEY REFERENCES USERFORM(USER_ID),
    START_DATE DATE NOT NULL,         
    END_DATE  DATE NOT NULL       
    INSTITUTION VARCHAR2(100) NOT NULL
    COURSE VARCHAR2(70) NOT NULL 
    AT_DESCRIPTION VARCHAR2(200) 
);

Вы действительно хотите иметь первичный ключ в таблице. В большинстве случаев я бы рекомендовал автоинкрементный первичный ключ. Но это трудно сделать автоматически в Oracle до Oracle 12. Такой столбец должен называться примерно так: ACADEMICTRAINING_ID.

Вместо этого вам действительно нужен уникальный ключ. Я не знаю, что соответствует вашим требованиям, но допустим, что первые два столбца не могут быть повторены (может быть задействовано больше столбцов). Тогда:

ALTER TABLE ACADEMICTRAINING ADD CONSTRAINT UNQ_ACADEMICTRAINING_2
    UNIQUE (USER_ID, START_DATE);

Все, что сказано, то, что вам нужно в вашем UPDATE, - это способ выбрать , который строка. Примерно так:

UPDATE ACADEMICTRAINING
    SET . . .
    WHERE USER_ID = :USER_ID AND START_DATE = :START_DATE;

Если бы у вас был первичный ключ, он бы выглядел так:

UPDATE ACADEMICTRAINING
    SET . . .
    WHERE ACADEMICTRAINING_ID = :ACADEMICTRAINING_ID;
0 голосов
/ 05 октября 2019

Попробуйте это.

 Update ACADEMICTRAINING
 set COURSE = 'BSC.CS'
 where AT_ID = (select USER_ID
                from USERFORM
                where FIRSTNAME = 'Ali'
                and LASTNAME = 'Ahmed'
                and PHONE = '44425183658558' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...