2014-03-04 10 views
0

У меня есть таблица с двумя столбцами даты, open_date и close_date. И когда я вставляю новую строку, close_date может быть нулевым. Но в будущем мне захочется обновить close_date, и я хочу убедиться, что close_date больше, чем open_date? ThanxSQL, как обновить столбец со значением, которое зависит от значения другого столбца в той же таблице

Я использую оракула ...

ответ

-1

Вы можете нуждаться в CHECK ограничений.

Пожалуйста, обратитесь к link

+0

Большое спасибо – Shmuli

+2

Пожалуйста, смотрите [w3fools.com] (http://w3fools.com). – ErikE

+0

Я попробовал, он говорит мне, что ограничение проверки столбцов не может ссылаться на другие столбцы. есть идеи? – Shmuli

1

А check constraint, как это будет делать спросите вы спросите:

ALTER TABLE YourTable ADD CONSTRAINT CK_open_date_before_close_date 
    CHECK (open_date < close_date); 

Это будет отвергать любые транзакции, которые обновляют таблицу в состояние, которое нарушает условия. Если, например, вы обновили 5 строк, но только один из них нарушил ограничение, все обновление завершится неудачно.

Кроме того, я бы порекомендовал, что вместо NULL за открытую дату закрытия вы используете оценочное значение 99991231. Этому есть много причин, не последним из которых является выполнение запросов (поэтому вы можете делать простые заявления о неравенстве, не требуя предложения OR IS NULL). Затем вы можете сделать столбец NOT NULL и упростить вышеуказанное условие проверки. Это также позитивно влияет на внешний код приложения.

UPDATE

Проверочное ограничение не требует OR close_date IS NULL в нем, так как если close_date является NULL, все выражение будет вычисляться в NULL, и это не будет нарушать CHECK ограничения.

+0

Im с использованием oracle, и ошибка всплыла с помощью messege: Ограничение проверки столбцов не может ссылаться на другие столбцы – Shmuli

+0

Какая версия Oracle? Он отлично работает в Oracle 11g. – ErikE

+0

Да, это работает. но когда я пытаюсь вставить строки (используя генератор данных - PL/SQL), он добавляет строки, которые не соответствуют этому ограничению. – Shmuli

1

Вы можете добавить проверочное ограничение, чтобы убедиться, что Close_date больше, чем Open_Date,

ALTER TABLE Table_Name 
ADD CONSTRAINT ck_Con_Name CHECK (Close_date > Open_Date) 

Чтобы убедиться, что значение предоставляется для столбца Close_Date и его не левый нуль, сделать столбец NON-NULABLE.

Для этого вам необходимо убедиться, что в нем нет значений NULL. ОБНОВЛЯЙТЕ столбец до некоторого значения defualt. Затем Alter определение таблицы что-то вроде этого ...

ALTER TABLE Table_Name 
ALTER COLUMN Close_date DATETIME NOT NULL; 
Смежные вопросы