在Oracle中创建表时出错

时间:2015-06-29 10:38:00

标签: sql oracle

CREATE TABLE employee
  (
    empno         INT PRIMARY KEY,
    ename         VARCHAR(20)  NOT NULL,
    post          VARCHAR (10) NOT NULL,
    gender        CHAR(1),
    citizenshipno VARCHAR(10),
    salary        NUMERIC(10,6) DEFAULT 10000,
    deptno        INT,
    CONSTRAINT ck_gender CHECK(gender IN('M','F')),
    CONSTRAINT uc_citizenshipno UNIQUE(citizenshipno),
    CONSTRAINT fk_department FOREIGN KEY(deptno) REFERENCE department(deptno)
  )

它说缺少关键字......我需要帮助才能真正禁止某人

2 个答案:

答案 0 :(得分:1)

存在多个问题:

首先 - 在创建外键约束时使用REFERENCES而不是REFERENCE

第二个 - salary被定义为numeric(10,6) - 这为小数点左边的四位数留下了空间,因此默认值10000不适合字段,因为它在小数点左边有五位数。我将此列的定义更改为numeric(11,6)

第三 - 使用VARCHAR2代替VARCHAR。 Oracle已经表示,在某些时候,他们会改变VARCHAR的行为以符合ANSI定义,这意味着它的行为将发生变化。在此之前(可能会或可能不会发生)使用VARCHAR2

将以上所有内容合并在一起我们得到:

create table employee
 (empno int primary key,
  ename varchar2(20) not null,
  post varchar2(10) not null,
  gender char(1),
  citizenshipno varchar2(10),
  salary numeric(11,6) default 10000,
  deptno int,
  constraint ck_gender check(gender in('M','F')),
  constraint uc_citizenshipno unique(citizenshipno),
  constraint fk_department foreign key(deptno)
     references department(deptno));

祝你好运。

答案 1 :(得分:0)

您的CREATE语句存在多个问题:

  • IS NOT NULL

应为 NOT NULL

  • REFERENCE

REFERENCE关键字错误,应为 REFERENCES

  • VARCHAR data type

更好地使用 VARCHAR2 。来自documentation

  

VARCHAR数据类型与VARCHAR2数据类型同义。至   避免可能的行为更改,始终使用VARCHAR2数据类型   存储可变长度的字符串。

  • NUMERIC(10,6) DEFAULT 10000

指定的精度不正确。它将抛出:

  

ORA-01438:大于此指定精度的值   柱

因为,id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY en ALL PRIMARY NULL NULL NULL 12889 Using where; Using temporary; Using filesort 1 PRIMARY g ref id_ente id_ente 5 disasrl.en.ID 4 NULL 1 PRIMARY tg eq_ref PRIMARY PRIMARY 4 disasrl.g.tipo_gara 1 NULL 1 PRIMARY ad eq_ref PRIMARY,id PRIMARY 4 disasrl.g.opElab 1 Using index 1 PRIMARY ep eq_ref PRIMARY PRIMARY 4 disasrl.g.indirizzo_ente 1 Using index 1 PRIMARY ta eq_ref PRIMARY PRIMARY 4 disasrl.g.criterio_aggiudicazione 1 NULL 2 DEPENDENT SUBQUERY A ALL NULL NULL NULL NULL 152721 Using where; Using filesort 2 DEPENDENT SUBQUERY Cl eq_ref PRIMARY PRIMARY 4 disasrl.A.id_classifica 1 NULL 2 DEPENDENT SUBQUERY TIG eq_ref PRIMARY PRIMARY 4 disasrl.A.id_tipologia_gara 1 NULL 3 UNCACHEABLE SUBQUERY bootstrap_colors ALL NULL NULL NULL NULL 11 Using where; Using temporary; Using filesort 表示10是精度,6表示比例。因此,您可以在小数点前 4位数,而在(10,6)中有 5位有效数字

将其更改为:

10000