我正在使用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错误但我无法解决此问题。
答案 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)
);