Oracle SQL присваивает определенные значения

#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>