【问题标题】:ORA-00907: missing right parenthesis 00907. 00000ORA-00907: 缺少右括号 00907. 00000
【发布时间】:2020-10-07 19:06:06
【问题描述】:

create table SalesFact
(CalendarKey INT NOT NULL FOREIGN KEY REFERENCES Calendar,
BranchKey INT NOT NULL FOREIGN KEY REFERENCES Branch,
ProductKey INT NOT NULL FOREIGN KEY REFERENCES Product,
SalesClerkKey INT NOT NULL FOREIGN KEY REFERENCES SalesClerk,
TID CHAR(15),
TimeofDay TIME,
DollarsSold NUMBER(10,2),
UnitsSold NUMBER (5),
PRIMARY KEY (ProductKey, TID));

尝试了几种方法都没有成功,我哪里出错了?

Error starting at line : 1 in command -
create table SalesFact
(CalendarKey INT NOT NULL FOREIGN KEY REFERENCES Calendar,
BranchKey INT NOT NULL FOREIGN KEY REFERENCES Branch,
ProductKey INT NOT NULL FOREIGN KEY REFERENCES Product,
SalesClerkKey INT NOT NULL FOREIGN KEY REFERENCES SalesClerk,
TID CHAR(15),
TimeofDay TIME,
DollarsSold NUMBER(10,2),
UnitsSold NUMBER (5),
PRIMARY KEY (ProductKey, TID))
Error report -
ORA-00907: missing right parenthesis
00907. 00000 -  "missing right parenthesis"
*Cause:    
*Action:

谢谢。

【问题讨论】:

  • 第一次尝试时,您能否从您的 DDL 中删除 FOREIGN KEY 字样?看看 Bob Jarvis 的回答,stackoverflow.com/questions/48045336/…
  • 顺便说一下,Oracle 使用VARCHAR2 表示字符串。 CHAR 是一种固定长度的类型,一般对一般字符串列没有用处。

标签: sql oracle entity-framework


【解决方案1】:
SQL> create table SalesFact
  2  (CalendarKey   INT NOT NULL  REFERENCES Calendar,
  3   BranchKey     INT NOT NULL  REFERENCES Branch,
  4   ProductKey    INT NOT NULL  REFERENCES Product,
  5   SalesClerkKey INT NOT NULL  REFERENCES SalesClerk,
  6   TID           CHAR(15),
  7   TimeofDay     DATE,
  8   DollarsSold   NUMBER(10,2),
  9   UnitsSold     NUMBER (5),
 10   PRIMARY KEY (ProductKey, TID)
 11  );

Table created.
  • 删除FOREIGN KEY
  • 没有TIME 数据类型;使用DATE

除此之外,命名约束是一个好习惯。主键不允许 NULL 值,因此您可以为这些列省略 NOT NULL。例如:

SQL> create table SalesFact
  2  (CalendarKey   INT constraint fk_sf_cal
  3                       REFERENCES Calendar (calendarkey)
  4                       NOT NULL,
  5   ProductKey    INT constraint fk_sf_prod
  6                       REFERENCES Product (productkey),
  7   TID           CHAR(15),
  8   constraint pk_sf PRIMARY KEY (ProductKey, TID)
  9  );

Table created.

SQL>

【讨论】:

  • 天啊,这对你有很大帮助!!正在关注讲座幻灯片,想知道我在讲义中哪里出错了!现在意识到没有“时间”这样的数据类型!
  • 如果有帮助我很高兴。
【解决方案2】:

您不需要在内联约束中使用 FOREIGN KEY 关键字,只需 REFERENCES 关键字,您还应该明确告诉它您引用的是表的哪一列。

Oracle 没有TIME 数据类型。如果您只想要一天中的时间,那么您应该使用INTERVAL DAY TO SECOND,但如果您想要日期和时间,请使用DATE 数据类型。

您还可以养成良好的习惯并命名您的约束,而不必在出错时解码系统生成的约束名称。

create table SalesFact(
  CalendarKey   INT
                CONSTRAINT SalesFact__CalendarKey__NN NOT NULL
                CONSTRAINT SalesFact__CalendarKey__FK REFERENCES Calendar ( other_id ),
  BranchKey     INT
                CONSTRAINT SalesFact__BranchKey__NN NOT NULL
                CONSTRAINT SalesFact__BranchKey__FK REFERENCES Branch( branch_id ),
  ProductKey    INT
                CONSTRAINT SalesFact__ProductKey__NN NOT NULL
                CONSTRAINT SalesFact__ProductKey__FK REFERENCES Product ( product_id ),
  SalesClerkKey INT
                CONSTRAINT SalesFact__SalesClerkKey__NN NOT NULL
                CONSTRAINT SalesFact__SalesClerkKey__FK REFERENCES SalesClerk ( sales_id ),
  TID           CHAR(15),
  TimeofDay     INTERVAL DAY TO SECOND,
  DollarsSold   NUMBER(10,2),
  UnitsSold     NUMBER (5),
  CONSTRAINT SalesFact__ProductKey__TID__PK PRIMARY KEY (ProductKey, TID)
);

db小提琴here

【讨论】:

    【解决方案3】:

    您也可以使用以下语法

    CREATE TABLE SalesFact
    (
      CalendarKey      INT NOT NULL,
      BranchKey        INT NOT NULL,
      ProductKey       INT NOT NULL,
      SalesClerkKey    INT NOT NULL,
      TID              CHAR (15),
      TimeofDay        DATE,
      DollarsSold      NUMBER (10, 2),
      UnitsSold        NUMBER (5),
      CONSTRAINT fk_CAlendarKey FOREIGN KEY (CalendarKey)
        REFERENCES Calendar (PKID),
      CONSTRAINT fk_BRANCHKEY FOREIGN KEY (BranchKey) REFERENCES Branch (PKID),
      CONSTRAINT FK_PRODUCTKEY FOREIGN KEY (ProductKey) REFERENCES PRODUCT (PKID),
      CONSTRAINT fk_salesClerkKey FOREIGN KEY (SalesClerkKey)
        REFERENCES SalesClerk (PKID),
      PRIMARY KEY (ProductKey, TID)
    )
    

    【讨论】:

      猜你喜欢
      • 2016-10-23
      • 1970-01-01
      • 2021-01-28
      • 2017-05-28
      • 1970-01-01
      • 2018-05-23
      • 2018-12-06
      相关资源
      最近更新 更多