У меня есть таблица с внешним ключом для другой таблицы.
Например: Postion.day REFERENCES weekdays.day
что нормально. Однако Position.day
может содержать рабочие дни, где rdo=true
.
Основной способ доступа к этим данным планируется через веб-приложение, которое я наблюдаю. В любом случае я планирую добавить эту проверку в веб-приложение. Я просто ищу способ обеспечить как можно большую целостность данных на уровне БД, если не считать написания триггеров.
Я подозреваю, что ответ будет выглядеть примерно так:
ALTER TABLE Postition ADD COLUMN day CHAR(3)
FOREIGN KEY REFERENCES weekday(shortName)
CHECK (weekday.rdo=TRUE);
Обычно я бы "попробовал и увидел", однако мне нужно было внести много изменений, и я все еще дорабатывал свой дизайн, и подумал, что я спрошу экспертов и посмотрим, что они скажут, пока я работаю над остальное.
UPDATE
Итак, у меня есть таблица, Name Table
(я не назвал ее), у меня есть еще одна таблица дней недели, в которой перечислены все 7 дней недели вместе с другой информацией. Таблица имен имеет 2 внешних ключа rdo и shortDay. Будние дни содержат битовое поле для rdo и битовое поле для короткого дня, в котором указано, подходит ли день для этих дней. Поэтому я хочу, чтобы мое поле RDO было внешним ключом для рабочих дней, но ТОЛЬКО ГДЕ RDO = TRUE
Первичный ключ в будние дни - это короткое имя, 3 буквы (символ (3)), обозначающие день недели, например: понедельник, вторник, среда, четверг и т. Д.
Я думал об этом и вспомнил транзакции SQL (в настоящее время я держу пари, что SQL Server будет достаточно умен, чтобы откатить успешный вызов ALTER TABLE, таблица позиций уже существует.)
BEGIN
ALTER TABLE [Name Table] ADD RDO CHAR(3);
ALTER TABLE [Name Table] ADD FOREIGN KEY (RDO) REFERENCES weekdays(shortName);
ALTER TABLE [Name Table] ADD CHECK (TRUE=(SELECT rdo FROM weekdays
WHERE shortName=RDO));
ROLLBACK;
Что возвращается из базы данных:
Код ошибки 102, состояние SQL S0001: неправильный синтаксис рядом с ')'.
Строка 1, столбец 1
Код ошибки 1769, состояние SQL S0001: внешний ключ «RDO» ссылается на недопустимый столбец «RDO» в ссылочной таблице «Таблица имен».
Строка 3, столбец 1
Код ошибки 1046, состояние SQL S0001: подзапросы в этом контексте запрещены. Допускаются только скалярные выражения.
Строка 4, столбец 1
Код ошибки 3903, состояние SQL S0001: у запроса ROLLBACK TRANSACTION нет соответствующей BEGIN TRANSACTION.
Строка 5, столбец 1
Итак, добавить внешний ключ достаточно просто, но я все еще нахожусь в тупике о том, как ссылаться на связанную дату в другой таблице внутри проверочного ограничения.
В идеале синтаксис должен выглядеть так (я знаю, что он недействителен):
ALTER TABLE [Name Table] ADD RDO CHAR(3)
FOREIGN KEY REFERENCES weekdays(shortName,rdo=true);
это помогает?