2016-03-30 3 views
1

Я пытаюсь написать некоторый код DDL с просьбой о диапазоне номеров, но не могу найти ничего, что искал в Интернете. До сих пор у меня есть:SQL DDL Number range

create table Section (
    c# numeric(10), 
    se# numeric(10), 
    emp# numeric(5), 
    time numeric(5), 
    constraint Section_PK primary key (c#, se#), 
    constraint Section_FK_Course foreign key (c#) references Course, 
    constraint Section_FK_Employee foreign key (emp#) references Employee 
) 

Где моя Блокпост есть, мне нужно иметь «контрольный номер» быть любым числом от 40 до 60 лет, и недобросовестного до 20, в то время как в то же самое время, если с # находится в пределах 3000 до 4000, тогда контрольный номер должен быть меньше 40.

Я просто очень смущен, как это сделать. Является ли это «если тогда» вид заявления? Я не делал ничего подобного раньше и не знаю, как и где начать искать.

+1

Что такое «контрольный номер» и каково его использование? – AKS

+0

@ Примите мои извинения, я забыл добавить его в первоначальный список.Я был немного смущен относительно того, следует ли мне добавить его. Я _think_, это должно быть «контрольное число числовое (4)», но это действительно вся информация, которую у меня есть. – bonzo

+0

Является ли это утверждение даже правильным: «Мне нужно иметь« контрольный номер »для любого числа от 40 до 60 и по умолчанию 20? Если это должно быть от 40 до 60, то как оно по умолчанию равно 20? – AKS

ответ

0

Вы можете посмотреть в check constraint:

Проверочное ограничение представляет собой тип ограничений целостности в SQL, который определяет требования, которые должны быть выполнены на каждой строке в таблице базы данных. Ограничение должно быть предикатом. Он может ссылаться на один или несколько столбцов таблицы. Результатом предиката может быть либо TRUE, FALSE, либо UNKNOWN, в зависимости от наличия NULL. Если предикат оценивает UNKNOWN, то ограничение не будет нарушено, и строка может быть вставлена ​​или обновлена ​​в таблице. Это вопреки предикатам в предложениях WHERE в операторах SELECT или UPDATE .

Например, в таблице, содержащей продукты, можно было бы добавить проверку ограничение таким образом, чтобы цена продукта и количества продукта является неотрицательным значением:

PRICE >= 0

QUANTITY >= 0

Если эти ограничения не были на месте, можно было бы иметь отрицательную цену (- 30 долларов США) или количество (-3 позиции).

Проверяющие ограничения используются для обеспечения достоверности данных в базе данных и обеспечения целостности данных. Если они используются на уровне базы данных , приложения, использующие базу данных, не смогут добавить недопустимые данные или изменить действительные данные, чтобы данные стали недействительными, , даже если само приложение принимает недопустимые данные.

Различные продукты rdbms реализуют ограничение проверки по-разному (некоторые совсем отсутствуют), поэтому ознакомьтесь с руководством по rdbms на контрольном ограничении.

+0

Итак, проверка ограничений забила мне некоторую память. Поэтому, если я понимаю это право, изначально у меня было бы 'control_number numeric (5) default '20'', а затем ограничение типа:' ограничение ограничения. Section_control_number check (control_number> 40 AND control_number <60) ' – bonzo

+0

Что относительно if «C# находится в пределах от 3000 до 4000»? Я не вижу этого в вашем коде ограничения. Но это ваш код, ваши данные, вы можете сами проверить ограничение. – Shadow

+0

Это был мой следующий мост, чтобы пересечь. И вдобавок ко всему, я не могу «проверить» код. Вся информация у вас есть то, что мне дано, кроме ERD. Мой первоначальный вариант был чем-то вроде функции if-then, но я знаю, что это не решение. – bonzo

0

Я более склонен рекомендовать подход на основе trigger, а не check constraint. У вас не может быть check constraint, ограничивающий значения от 40 до 60, а затем значение default, равное 20. Они конфликтуют друг с другом. С помощью trigger вы можете реализовать все эти проверки и вернуть сообщения об ошибках, которые сообщают пользователю, почему сбой insert.

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