#sql #oracle #check-constraints
#sql #Oracle #проверка-ограничения
Вопрос:
Итак, я работаю над своей курсовой работой, и я как бы застрял в том, что делать с этой частью. Вопрос заключается в следующем :
Flatpack (идентификатор FlatpackID, имя, цвет, тип, цена единицы измерения)
-
FlatpackID должен быть сгенерирован СУБД
-
Имя содержит не более 20 символов и не должно быть null
-
Цвет необязателен
-
Тип является одним из (офис, кухня, спальня, общий)
-
Цена единицы измерения должна составлять от 5,00 до 500,00
Хорошо, итак, мне нужна помощь с тем, что выделено жирным шрифтом / курсивом, т. Е. «Тип — один из (офис, кухня, спальня, общие»)
Как именно я объявляю это в своем
CREATE TABLE FLATPACK (
);
Я спросил, и мне сказали, что разрешены только эти значения и ничего больше.
Будем признательны за любую помощь! Спасибо
Ответ №1:
Одним из методов является ограничение проверки:
constraint chk_flatpack_type check ( Type in ('Office', 'Kitchen', 'Bedroom', 'General') );
Другой вариант — установить ограничение внешнего ключа для справочной таблицы, и чтобы справочная таблица содержала только эти значения.
Ответ №2:
Это один из вариантов (с типами, ограниченными контрольным ограничением):
SQL> CREATE TABLE flatpack
2 (
3 flatpackid NUMBER CONSTRAINT pk_fp PRIMARY KEY,
4 name VARCHAR2 (20) NOT NULL,
5 colour VARCHAR2 (20),
6 TYPE VARCHAR2 (20)
7 CONSTRAINT ch_ty CHECK
8 (TYPE IN ('Office',
9 'Kitchen',
10 'Bedroom',
11 'General')),
12 unitprice NUMBER CONSTRAINT ch_pr CHECK (unitprice BETWEEN 5 AND 500)
13 );
Table created.
SQL>
Другой, лучший (почему? Более гибкий, поскольку вы можете добавить любой тип, который вы хотите, без изменения таблицы) вариант заключается в создании таблицы, на которую будет ссылаться столбец TYPE:
SQL> CREATE TABLE flatpack_type (TYPE VARCHAR2 (20) CONSTRAINT pk_ty PRIMARY KEY);
Table created.
SQL> CREATE TABLE flatpack
2 (
3 flatpackid NUMBER CONSTRAINT pk_fp PRIMARY KEY,
4 name VARCHAR2 (20) NOT NULL,
5 colour VARCHAR2 (20),
6 TYPE VARCHAR2 (20)
7 CONSTRAINT fk_fp_ty REFERENCES flatpack_type (TYPE),
8 unitprice NUMBER CONSTRAINT ch_pr CHECK (unitprice BETWEEN 5 AND 500)
9 );
Table created.
SQL> insert into flatpack_type --> valid values
2 select 'Office' from dual union all
3 select 'Kitchen' from dual union all
4 select 'Bedroom' from dual union all
5 select 'Genral' from dual;
4 rows created.
В качестве идентификатора вы могли бы использовать столбец идентификатора (если на 12c или выше) или стандартный вариант для более низких версий — триггер, который использует последовательность:
SQL> create sequence seq_fp;
Sequence created.
SQL> create or replace trigger trg_bi_fp
2 before insert on flatpack
3 for each row
4 begin
5 :new.flatpackid := seq_fp.nextval;
6 end;
7 /
Trigger created.
SQL>