Нет ограничений по внешнему ключу и нужно делать сложное удаление - PullRequest
0 голосов
/ 22 мая 2011

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

Мой сайт занимается планированием походов.После создания похода с ним связано много вещей: доска объявлений, список участников, группа, к которой он относится, автобаза, маршрут, маршрут и т. Д.

Вот пример, который вы можетепосмотрите, о чем я говорю: http://www.comehike.com/hikes/scheduled_hike.php?hike_id=172

Технический долг, о котором я говорю, состоит в том, что я никогда не делал внешние ключи в БД, и теперь мне нужно сделать каскадное удаление, и я не уверен, как это сделать.сделайте так, чтобы я не представил миллион ошибок:)

Должен ли я сейчас сделать внешние ключи для всех таблиц?Как мне это сделать?

Спасибо, Алекс

Ответы [ 4 ]

2 голосов
/ 22 мая 2011

Я бы предложил создать внешние ключи для таблиц в вашей БД.Это будет более надежный способ решения проблемы, с которой вы столкнулись.Вы, очевидно, понимаете, что внешний ключ накладывает на базу данных и как обращаться с ключами.

Если бы я столкнулся с этой проблемой, я бы использовал графический интерфейс для базы данных, если он у меня был (например, PhpMyAdmin).), в противном случае быстрый Google выводит некоторые учебные пособия .


РЕДАКТИРОВАТЬ: из связанного учебного пособия, в отношениях «многие к одному», вы нажимаете клавишу «многиеmsgstr "таблица, указывающая, что определенный столбец в этой таблице может иметь только значения, которые присутствуют в определенном столбце в таблице" один ".Здравствуйте, ссылка для работающего примера.

При добавлении ключей в таблицу, в которой уже есть данные, вы не сможете добавить внешний ключ, если некоторые данные искажены.Например, если у вас есть таблица телефонных номеров, ссылающаяся на таблицу лиц (множество телефонных номеров одному человеку), и у вас есть какие-либо номера телефонов с недействительным person_id (возможно, человек 5 был удален, а еще есть номер телефона с person_id 5) вы не сможете создать внешний ключ до тех пор, пока не удалите вызывающий беспокойство номер телефона.

2 голосов
/ 22 мая 2011

Ознакомьтесь с документами MySQL по Ограничения FOREIGN KEY .Обратите внимание, что вам нужно использовать таблицы innoDB.

ALTER TABLE <tablename>
ADD CONSTRAINT <fkname> FOREIGN KEY <index name>(<columns>)
REFERENCES <othertable> (<columns>)
ON DELETE CASCADE
1 голос
/ 22 мая 2011

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

В противном случае это, вероятно, редизайн или добавление в удовольствие от посторонних.=))

Если вы еще не получили себе копию MySQL Workbench и перепроектируете ее оттуда, добавив внешние ключи.Это также сгенерирует код SQL для вас.

0 голосов
/ 22 мая 2011

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

http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_7004.htm http://msdn.microsoft.com/en-us/library/ms189799.aspx

первый кажется более прямым и понятным, но если ни один из них не поможет, просто выполните поиск в Google по триггерам БД.и все готово!

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...