Таблица SQL не создается - PullRequest
0 голосов
/ 05 мая 2018

Я использую Oracle.

CREATE TABLE  "CUSTOMER" 
(  

"CUS_ID" VARCHAR2(9), 
    "CUSTOMER_NAME" VARCHAR2(30), 
    "EMAIL" VARCHAR2(30), 
    "BIRTH_DATE" DATE, 
    "Mobile_number" NUMBER (10),
    "Number_adopted" (number) (1);
     CONSTRAINT "CUSTOMER_PK" PRIMARY KEY ("CUS_ID")
     constraint "Email_uni" unique (EMAIL)
     constraint "Mobile_uni" unique (Mobile_number)
     constraint "adopted_range_ck" check ( Number_adopted >=1 and Number_adopted<=4)   USING INDEX  ENABLE
   );

Я получаю:

ORA-00902: неверный тип данных

Также в этой таблице:

CREATE TABLE  "ANIMAL" 
   (    "ANIMAL_ID" VARCHAR2(9), 
    "ANIMAL_NAME" VARCHAR2(30),
    "AGE" NUMBER(2),
    "ANIMAL_TYPE" VARCHAR2(30),
    "EXPENCES" NUMBER (10),
    "ADOPTED" VARCHAR2(9),

     CONSTRAINT "ANIMAL_PK" PRIMARY KEY ("ANIMAL_ID")
     CONSTRAINT "ANIMAL_EXP_ck check" ( EXPENCES >=1 and EXPENCES<=1000)
     CONSTRAINT "ANIMAL_AGE_ck check" ( AGE >=1)
  USING INDEX  ENABLE
   );

Я получаю ошибку Missing Right Parenthesis, но я не могу решить эту проблему.

Ответы [ 2 ]

0 голосов
/ 05 мая 2018

Я бы всегда определял ограничения в один столбец в строке с соответствующим столбцом.

Кроме того, идентификаторы в двойных кавычках являются лишь источником ошибок и неудобств, если только у вас нет конкретной причины, по которой вам действительно нужно нестандартное имя. Не имеет смысла использовать их с именем с полностью прописными буквами, так как это уже значение по умолчанию, поэтому вы просто открываете возможность появления ошибок, например. если вы случайно назвали столбец "ANIMAL TYPE", когда имели в виду "ANIMAL_TYPE". Как правило, лучше избегать двойных кавычек.

Предложение using index предназначено для указания нестандартных свойств индекса для уникального или первичного ключа (для указания табличного пространства, параметров сжатия и т. Д.). Поскольку вы используете значения по умолчанию, вам это не нужно.

Ключевое слово enable также используется по умолчанию, поскольку ограничения создаются во включенном состоянии, если не указано иное, поэтому оно вам не нужно.

Ключевое слово between экономит много времени при вводе инклюзивных диапазонов.

Нет необходимости кодировать что-либо в верхнем регистре. Я понятия не имею, почему это так часто встречается. Лично я считаю, что это неправильно.

create table  customer 
( cus_id          varchar2(9)   constraint customer_pk primary key
, customer_name   varchar2(30)
, email           varchar2(30)  constraint email_uni unique
, birth_date      date
, mobile_number   number(10)    constraint mobile_uni unique
, number_adopted  number(1)     constraint adopted_range_ck check (number_adopted between 1 and 4) 
);

create table animal 
( animal_id       varchar2(9)   constraint animal_pk primary key
, animal_name     varchar2(30)
, age             number(2)     constraint animal_age_ck check (age >= 1)
, animal_type     varchar2(30)
, expenses        number (10)   constraint animal_exp_ck check (expenses between 1 and 1000)
, adopted         varchar2(9)
);
0 голосов
/ 05 мая 2018

У вас было ; после "Number_adopted" (number) (1), также круглые скобки вокруг number здесь неверны. Тогда вы забыли , после ограничений. Если вы определили столбец с " вокруг имени, а имя не все в верхнем регистре, регистр отдельных символов должен совпадать в последующих ссылках, и они также должны быть заключены в ". Вот почему ваш constraint "Mobile_uni" unique (Mobile_number) должен был быть изменен на constraint "Mobile_uni" unique ("Mobile_number"). (Но вы, вероятно, захотите пересмотреть это и сделать имена столбцов в верхнем регистре в первую очередь. Опыт подсказывает мне, что такая вещь - будущая ловушка, поскольку вы должны точно использовать это имя в любом запросе и т. Д., И это трудно заметить, что можно задаться вопросом, почему вещи не работают.) И это USING INDEX ENABLE было неуместно, я думаю.

CREATE TABLE  "CUSTOMER" 
(  

"CUS_ID" VARCHAR2(9), 
    "CUSTOMER_NAME" VARCHAR2(30), 
    "EMAIL" VARCHAR2(30), 
    "BIRTH_DATE" DATE, 
    "Mobile_number" NUMBER (10),
    "Number_adopted" number (1), -- delete ( ) ; add ,
     CONSTRAINT "CUSTOMER_PK" PRIMARY KEY ("CUS_ID") USING INDEX  ENABLE, --  add ,
     constraint "Email_uni" unique (EMAIL), --  add ,
     constraint "Mobile_uni" unique ("Mobile_number"), -- add ,  " "
     constraint "adopted_range_ck" check ( "Number_adopted" >=1 and "Number_adopted"<=4) -- move USING INDEX  ENABLE add " "
   );

Во втором вы также забыли , после ограничений и потеряли USING INDEX ENABLE. Вы также неправильно поместили " для проверочных ограничений и ввели в них ключевое слово CHECK.

CREATE TABLE  "ANIMAL" 
   (    "ANIMAL_ID" VARCHAR2(9), 
    "ANIMAL_NAME" VARCHAR2(30),
    "AGE" NUMBER(2),
    "ANIMAL_TYPE" VARCHAR2(30),
    "EXPENCES" NUMBER (10),
    "ADOPTED" VARCHAR2(9),

     CONSTRAINT "ANIMAL_PK" PRIMARY KEY ("ANIMAL_ID") USING INDEX  ENABLE, -- add ,
     CONSTRAINT "ANIMAL_EXP_ck" check ( EXPENCES >=1 and EXPENCES<=1000), -- add , move "
     CONSTRAINT "ANIMAL_AGE_ck" check ( AGE >=1) -- move "
  -- move USING INDEX  ENABLE
   );
...