Sql 获得';缺少或无效选项';运行此脚本时

Sql 获得';缺少或无效选项';运行此脚本时,sql,oracle,oracle-apex,Sql,Oracle,Oracle Apex,运行此脚本时,我得到了一个“缺少或无效选项”(完整错误是:ORA-00922:缺少或无效选项ORA-06512:at“SYS.WWV_DBMS_SQL_APEX_200100”,第581行ORA-06512:at“SYS.DBMS_SYS_SQL_SQL_SQL_200100”,第1658行ORA-06512:at“SYS.wv_DBMS_SQL_APEX_200100”,第567行ORA-06512:at“APEX_200100.WWV_FLOW_DYNAMIC_EXEC”,第2127行)。有

运行此脚本时,我得到了一个“缺少或无效选项”(完整错误是:ORA-00922:缺少或无效选项ORA-06512:at“SYS.WWV_DBMS_SQL_APEX_200100”,第581行ORA-06512:at“SYS.DBMS_SYS_SQL_SQL_SQL_200100”,第1658行ORA-06512:at“SYS.wv_DBMS_SQL_APEX_200100”,第567行ORA-06512:at“APEX_200100.WWV_FLOW_DYNAMIC_EXEC”,第2127行)。有问题的语句是“createtablemanufacturer(m_-name VARCHAR2(50),m_-id)”,我应该如何修复它

DROP TABLE vehicles CASCADE constraints;
DROP TABLE suppliers CASCADE constraints;
DROP TABLE manufacturer CASCADE constraints;

CREATE TABLE vehicles
    (VIN        VARCHAR2(17),
     brand      VARCHAR2(20),
     model      VARCHAR2(20),
     color      VARCHAR2(10),
     PRIMARY KEY (VIN, brand, model, color)
    );

CREATE TABLE suppliers
    (s_name     VARCHAR2(20), 
     s_id       VARCHAR2(15), 
     part_id    VARCHAR2(20),
     supply_date    VARCHAR2(15),    
     PRIMARY KEY (s_name, s_id, part_id, supply_date)
    );

CREATE TABLE manufacturer
    (m_name     VARCHAR2(50), 
     m_id       VARCHAR2(15), 
     s_name     VARCHAR2(20),
     VIN        VARCHAR2(17)),
     PRIMARY KEY (m_name, m_id)),
      FOREIGN KEY (s_name) REFERENCES suppliers
        ON DELETE SET NULL
     FOREIGN KEY (VIN) REFERENCES vehicles
        ON DELETE SET NULL
    );


--LOAD DATABASE

INSERT INTO vehicles VALUES ('JM1CW2BL4D0154490', 'Mazda', 'Mazda5', 'Brown');
INSERT INTO suppliers VALUES ('MNAO Supplier', 'MNAO', '308', '01/28/2013');
INSERT INTO manufacturer VALUES ('Mazda Motor Corp', 'MZDAY', 'MNAO Supplier', 'JM1CW2BL4D0154490');



车辆识别号(VIN)是唯一的;您不需要任何其他列来生成主键,因此您的
车辆
表可以:

创建表格车辆(
VIN VARCHAR2(17)
约束车辆vin pk主键,
VARCHAR2品牌(20)
约束车辆品牌不为空,
VARCHAR2型(20)
约束车辆模型不为空,
颜色VARCHAR2(10)
约束车辆颜色不为空
);
类似地,您可能只需要一列作为
供应商
中的主键(并且应该将日期值存储为
日期
数据类型):

创建表供应商(
s_name VARCHAR2(20)
约束供应商名称主键,
s_id VARCHAR2(15)
约束供应商的id不为空,
零件id VARCHAR2(20)
约束供应商\u零件\u id\u nn不为空,
供应日期
约束供应商\供应\日期\ nn不为空
);
然后您的
制造商表可以是:

创建表格制造商(
m_name VARCHAR2(50),
m_id VARCHAR2(15),
s_name VARCHAR2(20)
约束制造商\uu s\u名称\uu fk
在删除集NULL上引用供应商(s_名称),
VIN VARCHAR2(17)
约束制造商\uu vin\uu fk
参考删除集NULL上的车辆(vin),
约束制造商\uuuu m\u名称\uuuu m\u id\uuuu pk主键(m\u名称,m\u id)
);
(同样,您可能希望更改它,以便只有一列是主键。)

然后,您可以插入数据:

插入车辆值(“JM1CW2BL4D0154490”、“马自达”、“马自达5”、“棕色”);
在供应商价值中插入(“MNAO供应商”、“MNAO”、“308”、日期“2013-01-28”);
插入制造商值(“马自达汽车公司”、“MZDAY”、“MNAO供应商”、“JM1CW2BL4D0154490”);
(并且不要将日期作为字符串传递,请使用
TO_DATE
或日期文字。)


dbfiddle

您有一些不应该存在的额外右括号,如
主键(m_name,m_id))
。然后,外键定义在SQL中无效:您需要在父表中提供列名,如:
外键(s\u name)引用DELETE SET NULL上的供应商(s\u name)
。但即便如此:外键的格式也不正确:您只能引用父表中的主键(或一组唯一列),这不是您在这里要做的。你可能需要重新考虑你的设计。啊,谢谢。我没听清楚括号。我也修复了外键,并用MT0推荐的“约束”设置了一个新的设计。非常感谢!我计划实现更多查询并使用此方法。今天我确实学到了一些新东西。