Ограничение Проблема / Решение в sqlServer - PullRequest
1 голос
/ 03 марта 2010

Извините за мой поверхностный вопрос.
Представьте, что у меня есть 4 таблицы в моей базе данных (SQLServer 2005).
Изображение , Новости , товар и галерея Таблицы. В моей таблице изображений у меня есть 3 внешних ключа для всех 3 других таблиц, и все внешние ключи имеют значение NULL и значение по умолчанию = -1. Все таблицы имеют Первичные ключи и являются Идентификационными.

В моей веб-форме каждая вставленная мной фотография связана с одной , двумя или тремя другими таблицами.
пример : это может быть связано с NewsId = 4, galleryId = 2 и не связано с таблицей товаров. Итак, ProductId = -1.
Я не знаю, как вставить фотографию и не выдать эту ошибку "Оператор INSERT вступил в конфликт с ограничением FOREIGN KEY" FK_Picture_Product ""
. Я знаю, почему это так, и это из-за информирует ограничение FOREIGN KEY . Но я не знаю, как спроектировать свою базу данных, чтобы преодолеть эту проблему. Я надеюсь, что смогу с этим справиться.

p.s : Кроме того, в будущем я хочу запросить мою таблицу картинок по новостям, продуктам или галереям или смешанным из них.

Ответы [ 3 ]

1 голос
/ 03 марта 2010

зачем использовать -1 для неопределенного? для этого NULL! удалите значение по умолчанию и разрешите этим строкам иметь значение NULL при отсутствии строки FK.

1 голос
/ 03 марта 2010

Почему у вас есть значение по умолчанию -1 для ваших внешних ключей? При вставке новой строки, которая не заполняет один из внешних ключей, внешний ключ будет установлен в -1, что не соответствует ключу строки во внешней таблице.

У меня обычно просто нет внешнего ключа по умолчанию, и если во внешней таблице нет ссылки на строку, тогда внешний ключ равен нулю. Это допустимо, потому что вы определили все внешние ключи как nullable

1 голос
/ 03 марта 2010

это потому, что у вас нет продукта с идентификатором -1, вы должны установить значение по умолчанию в NULL и вставить нулевое значение вместо -1

Когда вы создаете внешний ключ, сервер sql проверяет, что вставленный внешний ключ существует в ссылочной таблице, в случае, если он не существует, поэтому RDMS отказывается вставлять строку.

...