Возможное решение для «спецификации ограничений, не разрешенной здесь» в Oracle live

#sql #oracle

Вопрос:

Я не знаю, что вызывает эту проблему. Кто-нибудь может помочь мне выяснить это? Также Oracle live не указывает, какая строка вызывает проблему.

 
create table EMP (
    EMPNO number(4),
    ENAME varchar2(10),
    EJOB varchar2(9) constraint def_job default 'CLRK',
    MGR_ID number(4) constraint supervisor references EMPNO,
    BIRTH_DATE date,
    SAL number(7,2) constraint salCheck check(SAL > 20000) constraint defSal default 20001,
    COMM number(7,2) constraint defComm default 1000,
    DEPTNO varchar2(3) constraint deptFk references DPT(DNO),
    PRJ_ID varchar2(9) constraint defa_prjID default 'P1', 
    DATE_OF_JOIN date,
    
    constraint pri_ky primary key(EMPNO)
);

 

Ошибка: ORA-02253: спецификация ограничений здесь не разрешена

Комментарии:

1. Почему SAL number(7,2) строка имеет два ограничения?

2. это было упомянуто в назначении, чтобы иметь значение по умолчанию и зарплату больше 20000.

3. default<value> не является допустимой спецификацией ограничения (и логически, что такое ограничение действительно ограничивает?). Пожалуйста, ознакомьтесь с документацией о create table и особенно с определением встроенного ограничения . Затем исправьте свой запрос и задайте вопрос о проблеме, которую вы не можете решить.

Ответ №1:

Значение по умолчанию не является ограничением, поэтому, например

 constraint def_job default 'CLRK'
 

должно быть просто

 default 'CLRK'
 

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

 constraint supervisor references EMPNO
 

должно быть

 constraint supervisor references emp(empno)
 

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

Это работает (после создания dept таблицы):

 create table dpt (dno integer primary key);

create table emp (
    empno           number(4) constraint pri_ky primary key,
    ename           varchar2(10),
    ejob            varchar2(9) default 'CLRK',
    mgr_id          constraint supervisor references emp(empno),
    birth_date      date,
    sal             number(7,2) default 20001 constraint salcheck check(sal > 20000),
    comm            number(7,2) default 1000,
    deptno          constraint deptfk references dpt(dno),
    prj_id          varchar2(9) default 'P1', 
    date_of_join    date
);
 

Комментарии:

1. Но когда значение «по умолчанию» добавляется после создания таблицы, SQL позволяет пользователю указывать имя ограничения на значение по умолчанию, также такие сайты, как w3school, упоминают «по умолчанию» в качестве ограничения. Я просто немного запутался здесь.

2. @BIjoyDas Если у вас есть ссылка на сайт, предлагающий это, мне было бы интересно ее увидеть. Значение по умолчанию не является ограничением, и вы не можете его назвать, поэтому, должно быть, что-то где-то перепуталось.

3. @BIjoyDas Не используйте w3schools, поскольку это далеко не простая для чтения документация для неправильной базы данных. Если вы хотите узнать, что разрешено в базе данных Oracle, воспользуйтесь документацией Oracle .

4. Я не хотел грубить, просто немного озадачен. вот ссылка:- w3schools.com/SQl/sql_default.asp

5. @BIjoyDas Посмотрите на решения для разных баз данных на этой странице — вам нужно прочитать Oracle, а не SQL Server. Или, что еще лучше, не используйте w3schools.