没有创建SQL表

时间:2018-05-04 23:53:47

标签: sql oracle create-table

我正在使用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 :(得分:2)

;之后你有一个"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
   );

答案 1 :(得分:1)

我总是定义与相应列内联的单列约束。

此外,双引号标识符只是错误和不便的来源,除非您有特定原因需要非标准名称。将它们与全大写字母名称一起使用是没有意义的,因为这已经是默认值,所以你只是开辟了陷入错误的可能性,例如:如果您在意图"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)
);