2012-06-08 3 views
1

так что я 3 таблицы:MySQL удалить триггер

tbl_client(clientpk, name, etc) 
tbl_address(address_pk, street1, street2 etc) 
tbl_client_address (client_address_pk, clientpk_fk, addresspk_fk) 

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

Возможно ли это?

+0

Вы используете innoDB или myisam? – Lee

+0

Я использую innoDB, изначально я сделал ссылку, но выяснил, что если бы я это сделал, он удалил бы только запись, которая связывает как клиент, так и адрес вместе, но сам адрес по-прежнему присутствует в соответствующей таблице. –

ответ

1

Если вы используете InnoDB, вы можете добавить ограничение ваших основных таблиц:

Constraint FOREIGN KEY (typeId) ЛИТЕРАТУРЫ types (id) ON DELETE CASCADE ON UPDATE CASCADE

, а не необходимость обходиться с помощью триггеров

+0

Да, это было мое первое решение, но, как я узнал, когда я удаляю запись из tbl_client, он удалит связанную запись с tbl_client_address, однако адрес, связанный с этой записью, все еще присутствует. то, что я пытаюсь или хочу достичь, - это когда я удаляю запись с клиента, она также удалит также адрес, а не только запись, которая связывает их вместе. –

+0

+1 ... потому что в любое время вы можете избежать триггеров, которые вы, вероятно, должны. – codemonkey

0

Тот факт, что вы удаляете удаленные записи адреса при удалении записи клиента, указывает на то, что вам действительно не нужна таблица разрешений tbl_client_address. Вам нужна только таблица tbl_client_address, если конкретный адрес может быть связан с более чем одним клиентом (и если бы это было так, вы бы не хотели автоматически каскадировать удаления на основе удаления записей tbl_client). Итак, я хочу сказать, что вам нужно подумать, достаточно ли просто иметь поле tbl_address.clientpk_fk, удалить таблицу tbl_client_address, а затем использовать предложенное ограничение Джеффа для каскадного удаления записей tbl_client.

+0

ну, действительно, мне нужен tbl_client_address, потому что некоторые из них имеют более 1 адреса (рассылка, биллинг, hq и т. Д.). на самом деле я получил его для работы, ссылаясь на fk на главную таблицу в tbl_client_address, но это будет означать, когда мне нужно сделать это в коде, мне нужно использовать pk для tbl_client_address, а не pk для tbl_client. –

+0

только потому, что существует более одного адреса, связанного с одним клиентом, не требует таблицы разрешения tbl_client_address. которые могут быть обработаны, просто имея более одной записи tbl_address, указывающей на запись tbl_client с использованием внешнего ключа. таблицы разрешения необходимы только тогда, когда между двумя внешними таблицами существует истинная взаимосвязь multi-to-multi ... так называемые клиенты, связанные с несколькими адресами и адресами, которые необходимо связать с несколькими клиентами. – codemonkey

+0

Да, я понимаю, что я только подразумевал свои 3 таблицы, но на самом деле таблица адресов также используется для продавцов, сотрудников, контактных лиц, местоположений проектов и т. Д. Это также касается моей контактной информации (номера телефонов, электронная почта, факс и т.д). единственное препятствие, которое я до сих пор на самом деле заключал в том, что, когда я удаляю клиента, я хочу, чтобы адреса, связанные с ним, тоже исчезли. я мог бы просто сделать DELETE * FROM tbl_client_address WHERE = id_client (и ссылаться на FK на главные таблицы), но это меня немного беспокоит, потому что я не знаю никаких ошибок, используя этот метод. –

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