2013-02-25 4 views
1

Я создаю таблицу базы данных и хочу, чтобы данные в одном из столбцов всегда были ограничены данными в столбце другой таблицы. например:Справочные данные из другой таблицы

Table_1 имеет Column_1
Column_1 может иметь значения:
v1
v2
v3
v4
v2
v3

Теперь я пытаюсь создать Table_2 с Column_3
и хотите удостовериться, что значения в этом столбце всегда являются подмножеством таблицы_1: столбец_1

Есть ли ограничение, которое я могу применить для достижения этого?

+0

Как и в общем комментарии, эта модель не денормализована, и поэтому вы работаете против естественной модели реляционной базы данных. Если модель была нормализована, то третья таблица, содержащая единственный первичный ключ уникальных значений в Table_1.Column_1, будет очевидна. Есть ли причина, по которой вы не нормализуете эти данные? –

+0

Я работаю над схемой, распространяющейся по различным модулям, существует несколько таблиц, таких как таблица 1, в то время как может быть возможно нормализовать некоторые из них, но не сможет сделать это для всех. – sachin

ответ

1

В Oracle и PostgreSQL, используйте проверочное ограничение

например, в Oracle:

ALTER TABLE Table_3 
ADD CONSTRAINT my_name 
CHECK 
    (column_3 in 
     (SELECT Column_1 FROM Table_1)) 

Это также работает с PostgreSQL

В SQL Server и DB2, я считаю, вы должны создайте функцию, которая выполняет фактический тест, но в остальном это одно и то же. Функция будет иметь один аргумент (значение столбца_3) и вернуть EXISTS (SELECT 1 FROM Table_1 WHERE Column_1 = argument).

К сожалению, в MySQL вам нужно будет использовать при вставке и обновлении триггеров

+0

Но column_1 не является первичным ключом таблицы_1, и не обязательно должен быть уникальным. – sachin

+0

Прости, пропустил это. Какую БД вы используете или настраиваете? –

+0

Oracle 11g R2, но в идеале я ищу универсальное решение. – sachin

0

Является ли Table_1.Column_1 уникальным?

  • Если да, просто сделать это PRIMARY KEY или UNIQUE, затем ссылаться на него из FOREIGN KEY на Table_2.Column_3.
  • Если нет (как видно из вашего примера), сделайте FK от Table_2 до основного ключа Table_1. Table_2.Column_3 даже не существует, вместо этого вы получите значения Table_1.Column_1, добавив две таблицы. Вы можете поместить этот JOIN в VIEW, чтобы он отображался (для клиентских приложений), как если бы действительно существовал Table_2.Column_3.
Смежные вопросы