Если я не понял вашего намерения, общая форма оператора SQL, который вы будете использовать, будет
ALTER TABLE FooExtension
ADD CONSTRAINT your-constraint-name
CHECK (ID_Foo = ID_Bar);
Это предполагает, что существующие данные уже соответствуют новому ограничению. Если существующие данные не соответствуют, вы можете либо исправить данные (при условии, что они нуждаются в исправлении), либо вы можете ограничить область действия (возможно) нового ограничения, также проверив значение ID_FooExtension. (Предполагая, что вы можете определить «новые» строки по значению ID_FooExtension.)
Позже. , .
Спасибо, я действительно неправильно понял вашу ситуацию.
Насколько я знаю, вы не можете применить это ограничение так, как вы хотите в SQL Server, потому что он не разрешает запросы SELECT в ограничении CHECK. (Я могу ошибаться в SQL Server 2008). Обычный обходной путь заключается в том, чтобы обернуть запрос SELECT в функцию и вызвать функцию, но, как я понял, это ненадежно.
Вы можете сделать это, хотя.
- Создать УНИКАЛЬНОЕ ограничение для Книги
(ID_Book, ID_Company). Часть этого будет выглядеть как
UNIQUE (ID_Book, ID_Company)
.
- Создание уникального ограничения на скидку (ID_Discount, ID_Company).
- Добавить две колонки в
BookExtension - Book_ID_Company и
Discount_ID_Company.
- Заполните эти новые столбцы.
- Изменить ограничения внешнего ключа
в BookExtension. Ты хочешь
BookExtension (ID_Book,
Book_ID_Company) для ссылки
Книга (ID_Book, ID_Company). Аналогичное изменение для внешнего ключа
ссылка на скидку.
Теперь вы можете добавить проверочное ограничение, чтобы гарантировать, что BookExtension.Book_ID_Company совпадает с BookExtension.Discount_ID_Company.