2015-11-02 4 views
0

У нас есть две таблицы с именем patron и cir_transaction.строки обновления, имеющие зависимости

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

update patron set patron_id=" " where patron_id="" like.... 
**original query**:(update patron set patron_id='" + patronIdTrim + "' where patron_id='" + patronId + "' and library_id=" + SimpleUtility.getLibraryId())); 

Но при выполнении он показывает

обновление или удаление на стол «покровитель» нарушает ограничение внешнего ключа «fk_111» на столе «cir_transaction

Я слишком попробуйте сначала обновить, что особенно patron_id в cir_transaction таблице как:

update cir_transaction set patron_id='" + patronIdTrim + "' where patron_id='" + patronId + "' and library_id=" + SimpleUtility.getLibraryId()); 

он показывает ошибку, как:

вставки или обновления на столе «cir_transaction» нарушает ограничение внешнего ключа «fk_111 "

Так скажите мне, как обновить эти строки (patron_id) в обеих таблицах? Все еще никто не понимает мой вопрос, пожалуйста, спросите меня, я расскажу подробно.

+0

Используйте внешние клавиши «ON UPDATE CASCADE». Подробнее см. Google и поиск переполнения стека. –

+0

Идея установки первичного ключа на одно место кажется немного странным. –

ответ

0

Как прокомментировал другой пользователь, вы должны использовать «UPDATE CASCADE» для одновременного обновления всех ссылочных таблиц.

Ниже приведен пример того, как сделать структуру таблицы:

--main table 
CREATE TABLE script_cadastro 
(
    cd_sequencia integer NOT NULL DEFAULT 0, 
    nr_atividade integer NOT NULL DEFAULT 0, 
    nm_script character varying(100) NOT NULL DEFAULT ''::character varying, 
    nr_versao character varying(10) NOT NULL DEFAULT ''::character varying, 
    observacao character varying(1000) NOT NULL DEFAULT ''::character varying, 
    script_conteudo character varying(5000) NOT NULL DEFAULT ''::character varying, 
    dt_cad date NOT NULL DEFAULT '1900-01-01'::date, 
    hr_cad time without time zone NOT NULL DEFAULT '00:00:00'::time without time zone, 
    CONSTRAINT script_cadastro_pk PRIMARY KEY (cd_sequencia) 
); 

--table with foreign key 
CREATE TABLE script_cadastro_itens 
(
    cd_sequencia INTEGER NOT NULL DEFAULT 0      , 
    versao_script VARCHAR(200) NOT NULL DEFAULT ''    , 
    usuario  INTEGER NOT NULL DEFAULT 0      , 
    dt_cad  DATE NOT NULL DEFAULT '1900-01-01'    , 
    hr_cad  TIME NOT NULL DEFAULT '00:00:00'    , 
    CONSTRAINT script_cadastro_itens_pk PRIMARY KEY (cd_sequencia), 
    CONSTRAINT script_cadastro_itens_fk FOREIGN KEY (cd_sequencia) REFERENCES script_cadastro (cd_sequencia) 
    ON UPDATE CASCADE 
    ON DELETE RESTRICT 
); 

На мой взгляд ... должен двигаться немного в первичном ключе. Сделайте обновления, модифицирующие его значение, как показано на примере, вы не считаете хорошей практикой, так что система компании, в которой я работаю, мы не просто обновляем этот способ.

Надеюсь, я помог вам!

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