Как изменить таблицу, чтобы добавить ограничение? - PullRequest
0 голосов
/ 06 ноября 2018

Итак, у меня вопрос:

Из-за различных значений, введенных пользователями для статуса объекта, это приводит до путаницы. Владелец базы данных хотел бы ограничить следующие значения «Открыто», «Закрыто», «Зарезервировано» и «Техническое обслуживание» для использования в статусе объект.

Моя таблица FACILITY имеет следующие столбцы:

FACILITYNAME
RATE
STATUS

Я попробовал следующее:

ALTER TABLE FACILITY ADD CONSTRAINT FACILITY_STATUS 'Open','Closed','Reserved','Maintenance' FOR STATUS;

Я получаю ошибку, ORA-00904: неверный идентификатор

Затем я попробовал следующее:

ALTER TABLE FACILITY ADD CONSTRAINT STATUS_CHECK CHECK (STATUS IN ('Open','Closed','Reserved','Maintenance'));

В нем указано, что таблица изменена, но когда я попытался обновить столбец STATUS, используя 'abc' и 'Open', он сообщает, что строка обновлена, но ничего не произошло. Я ожидал, что это даст мне ошибку ограничения для 'abc', и обновлю ее до 'Open'.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Странно, у меня все работает как положено:

CREATE TABLE FACILITY (
    FACILITYNAME VARCHAR2(100),
    RATE INTEGER,
    STATUS VARCHAR2(20));
Table created.

INSERT INTO FACILITY VALUES ('f1', 1, 'Open');
1 row created.

ALTER TABLE FACILITY ADD CONSTRAINT STATUS_CHECK CHECK (STATUS IN ('Open','Closed','Reserved','Maintenance'));
Table altered.

UPDATE FACILITY SET STATUS = 'abc';

ORA-02290: check constraint (XXX.STATUS_CHECK) violated

Может быть, проверить статус ограничения:

SELECT CONSTRAINT_NAME, STATUS, DEFERRABLE, DEFERRED 
FROM USER_CONSTRAINTS 
WHERE TABLE_NAME = 'FACILITY';

+------------------------------------------------+
|CONSTRAINT_NAME|STATUS |DEFERRABLE    |DEFERRED |
+------------------------------------------------+
|STATUS_CHECK   |ENABLED|NOT DEFERRABLE|IMMEDIATE|
+------------------------------------------------+

Также обратите внимание, что если вы не дадите пункт VALIDATE в ALTER TABLE, ограничение не проверяет существующие значения! По умолчанию ограничение влияет только на новые и обновленные значения.

0 голосов
/ 06 ноября 2018

Как @KaushikNayak предложил попробовать добавить проверочное ограничение:

ALTER TABLE FACILITY  ADD CONSTRAINT check_status CHECK (FACILITY_STATUS IN ('Open','Closed','Reserved','Maintenance'));

В противном случае Ограничение уровня столбца должно использовать другой столбец:

ограничение на уровне столбца Ограничения уровня столбца относятся к одному столбцу в таблице и не указывают имя столбца (кроме проверочных ограничений). Они относятся к столбцу, за которым они следуют .

Я предлагаю вам create table FACILITY_STATUS со столбцом STATUS в качестве первичного ключа и вставьте значения.

Затем добавьте ограничение к столбцу FACILITY таблицы STATUS, используя FACILITY_STATUS(STATUS) в качестве внешнего ключа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...