无法在CREATE TABLE中使用内联约束

liv*_*e75 4 oracle sqlplus

我在Oracle中有以下作为CREATE TABLE:

CREATE TABLE cs2_users (
    empnum     varchar2(12) PRIMARY KEY,
    toolsId    varchar2(20) 
        CONSTRAINT nn_cs2_users_toolsId NOT NULL
        CONSTRAINT fk_cs2_users_users FOREIGN KEY REFERENCES users.userid,
    admin      number(1,0) DEFAULT 0
        CONSTRAINT nn_cs2_users_admin NOT NULL
        CONSTRAINT ck_cs2_users_admin (admin IN (0,1)),
    givenname  varchar2(30) NOT NULL,
    middlename varchar2(30),
    sn         varchar2(30) NOT NULL,
    mail       varchar2(50) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

但是它失败并出现此错误:

ERROR at line 5:
ORA-02253: constraint specification not allowed here`
Run Code Online (Sandbox Code Playgroud)

当我使用SQL*Plus连接时,这是版本信息:

SQL*Plus: Release 11.2.0.3.0 Production on Tue Dec 18 16:38:27 2012

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Run Code Online (Sandbox Code Playgroud)

救命?

Jus*_*ave 5

如果要指定内联约束,则该定义与列的定义分开.如果要创建约束,则需要指定约束的类型CHECK.并且您的外键约束需要指定您引用的列.因此,例如,这将起作用

SQL> create table users( userid varchar2(20) primary key );

Table created.


SQL> CREATE TABLE cs2_users (
  2      empnum     varchar2(12) PRIMARY KEY,
  3      toolsId    varchar2(20) constraint nn_cs2_users_toolsId NOT NULL,
  4          CONSTRAINT fk_cs2_users_users FOREIGN KEY(toolsId) REFERENCES users(userid),
  5      admin      number(1,0) DEFAULT 0 constraint nn_cs2_users_admin NOT NULL,
  6          CONSTRAINT ck_cs2_users_admin CHECK(admin IN (0,1)),
  7      givenname  varchar2(30) NOT NULL,
  8      middlename varchar2(30),
  9      sn         varchar2(30) NOT NULL,
 10      mail       varchar2(50) NOT NULL
 11  );

Table created.
Run Code Online (Sandbox Code Playgroud)

虽然从列toolsId引用userId列似乎很奇怪users.您似乎更有可能希望列从表中toolsId引用该toolsId列,tools或者您希望将列命名为类似于userId您要引用该userId列的列users.但后来我会问为什么你有一个单独的cs2_users专栏,而不是简单地将这些信息放在users表格中.

  • "首先,没有NOT NULL的约束类型,因此您无法创建命名的NOT NULL约束".你当然可以.每个`not null`都会创建一个sys生成的检查约束.你可以根据需要命名.即`create table mytab(id number constraint foo_nn1 not null);`有效且将命名检查约束FOO_NN1而不是SYS_Cxxxx (3认同)