Внешний ключ со значением по умолчанию это doesn' t существуют в первичной таблице

Вот моя ситуация. У меня есть стол, где ценность колонки может быть ПУСТОЙ, 0, или стоимость от стола пыльника. У другого стола нет 0 стоимостей ни для каких рядов.

Каков мой наилучший вариант?

1) Не добавляйте FK.

2) добавьте 0 отчетов к внешней таблице.

3) что-то еще.

Я не могу изменить эти 0 стоимостей на пустой указатель. и этот 0 представляет действительную стоимость.

Спасибо за помощь.

0
nl ja de
Да, но для пункта 3, it' s важный;)
добавлено автор Raphaël Althaus, источник
@Raphaë lAlthaus добавил признаки, но it' s больше общего вопроса о наиболее успешной практике SQL. По крайней мере, для меня.
добавлено автор Dayton Brown, источник
@Raphaë Положительная сторона lAlthaus.
добавлено автор Dayton Brown, источник

3 ответы

Я лично обратился бы к схеме - или эта колонка - внешний ключ, или это не - кажется будто вы пытаетесь использовать колонку для 2 разных вещей ("0, представляет действительную стоимость"). Если вы не можете изменить схему, чтобы добавить, что подлинная колонка FK тогда идет с решением 1 как следующее лучшее (IMO)

1
добавлено
Мне только жаль, что я не мог вновь исследовать схему. Я определенно попросил изменять 0 на что-то еще, но это сломает веб-приложение.
добавлено автор Dayton Brown, источник
Могу я +2 этих ответа? @Dayton: Вы на самом деле используете колонку для 3 вещей: ПУСТОЙ УКАЗАТЕЛЬ для того, что это означает в вашем дизайне, 0 как действительное (особенный?) стоимость и все остальное оценивает как FK. Don' t делают это. Вновь исследуйте свою схему.
добавлено автор ypercubeᵀᴹ, источник

Если бы 0 действительная стоимость, я лично добавил бы 0 как отчет "внешней таблицы".

Или 3) используйте ОГРАНИЧЕНИЕ CHECK вместо FOREIGN KEY.

Но ответ не может быть 1) или 2) или 3) как "наиболее успешная практика универсальный ответ": это зависит от ваших потребностей (что должно произойти, когда что-то, связанное с вашим столом, удалено во внешней таблице, одна из самой важной вещи рассмотреть).

Слабость проверочных ограничений:

http://msdn.microsoft.com/en-us/library/ms188258 (v=sql.105) .aspx

Ограничения CHECK не утверждены во время Операторов удаления. Поэтому выполняя Операторы удаления на столах с определенными типами проверочные ограничения могут привести к неожиданным результатам. Например, считайте следующие заявления выполненными на столе CheckTbl.

0
добавлено
Заканчивается это вместо того, чтобы добавить отчет, we' ll делают 0' s пустой указатель. Однако я didn' t знают, что проблема с удаляет на клетчатом ограничении. Не также упоминание, что мне нравится FK' s для индикатора отношений схемы.
добавлено автор Dayton Brown, источник

Проверочное ограничение с СУЩЕСТВУЕТ (ВЫБЕРИТЕ 1 ИЗ OtherTable ГДЕ fkv=v), ИЛИ v=0 был бы выбором. Однако По исполнительным причинам реальный внешний ключ всегда предпочитается. (SQL Server может и использовать заявленные отношения внешнего ключа во время оптимизации запросов, часто приводящей к намного более быстрым вопросам.)

Кроме того, как Рафаэль Алтос упомянул, проверочные ограничения только проверяются, когда вы вставляете или обновляете отчет в дочерней таблице. Удаление родительского отчета обходится без помощи последствий, даже когда есть существующие дети. (Для этого вы могли добавить спусковой механизм, однако),

В целом, добавляя эти "0" отчет и объявляя реальный внешний ключ является вашим лучшим выбором.

0
добавлено
Я don' t думают, что SQL Server (или любой другой SQL-продукт) обеспечивает функциональность ПРОВЕРКА ограничения с подвопросами. (На самом деле Доступ MS обеспечивает их, но не действительно уверенный, что они работают 100% как ожидалось).
добавлено автор ypercubeᵀᴹ, источник
Вы правильны, подвопросы не поддерживаются непосредственно, но можно обернуть функциональность в функцию
добавлено автор Sebastian Meine, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)