【问题标题】:Oracle SQL Create Table IssueOracle SQL 创建表问题
【发布时间】:2016-03-08 22:22:46
【问题描述】:

当我尝试创建包含一些测试行的测试表时,SQL Plus 给出以下错误:

    SQL> CREATE TABLE test_table
  2  (
  3  test_data0 NUMBER(3) CONSTRAINT test_data0_pk PRIMARY KEY,
  4  test_data1 NUMBER(3) CONSTRAINT test_data1_fk REFERENCES test_table2, CONSTRAINT test_data1_condition NOT NULL,
  5  test_data2 DATE CONSTRAINT test_data2_condition NOT NULL,
  6  test_data3 NUMBER(2),
  7  test_data4 NUMBER(2) DEFAULT 0
  8  );
test_data1      NUMBER(3) CONSTRAINT test_data1_fk REFERENCES test_table2, C
ONSTRAINT test_data1_condition NOT NULL,

                               *
ERROR at line 4:
ORA-00904: : invalid identifier

如果我只将两个约束之一放在第 4 行,我不会收到任何错误。有什么问题?

【问题讨论】:

    标签: sql oracle ddl create-table


    【解决方案1】:

    内联约束不需要constraint 关键字。当然,您可以使用它。但是,特别是,not null 通常在没有约束的情况下表达。所以:

    CREATE TABLE test_table (
      test_data0 NUMBER(3) CONSTRAINT test_data0_pk PRIMARY KEY,
      test_data1 NUMBER(3) NOT NULL CONSTRAINT test_data1_fk REFERENCES test_table2,
      test_data2 DATE NOT NULL,
      test_data3 NUMBER(2),
      test_data4 NUMBER(2) DEFAULT 0
    );
    

    如果您确实多次使用constraint,则需要省略逗号。那就是你得到的错误。所以那一行是:

    test_data1 NUMBER(3) CONSTRAINT test_data1_fk REFERENCES test_table2
                         CONSTRAINT test_data1_condition NOT NULL,
    

    我经常将constraint 本身省略为内联约束:

    CREATE TABLE test_table (
      test_data0 NUMBER(3) PRIMARY KEY,
      test_data1 NUMBER(3) NOT NULL REFERENCES test_table2,
      test_data2 DATE NOT NULL,
      test_data3 NUMBER(2),
      test_data4 NUMBER(2) DEFAULT 0
    );
    

    诚然,违反时您会丢失约束的名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-08
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多