Как мне исправить ORA-00902: неверный тип данных при создании таблицы - PullRequest
0 голосов
/ 03 мая 2019

Я создаю таблицу в разделах команды SQL в уже заполненном сценарии. Я уже создал несколько таблиц, но в этой я получаю сообщение:

ORA-00902: неверный тип данных

CREATE TABLE Weapons 
(
    id NUMBER(4),
    name VARCHAR2(30),
    damage NUMBER(4),
    company_id VARCHAR2 (10),

    CONSTRAINT pk_Weapons PRIMARY_KEY(id),
    CONSTRAINT fk_Weapons_company 
        FOREIGN_KEY(company_id) REFERENCES Company(id),
    CONSTRAINT fk_Weapons_ammo 
        FOREIGN_KEY(ammo_id) REFERENCES Ammo(id)
);

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

В CONSTRAINT должно быть FOREIGN KEY, а не FOREIGN_KEY. Также это должно быть PRIMARY KEY, а не PRIMARY_KEY.

В соответствии с синтаксисом подчеркивание не требуется. Таким образом, запрос будет:

CREATE TABLE Weapons (
    id NUMBER(4),
    name VARCHAR2(30),
    damage NUMBER(4),
    company_id VARCHAR2(10),
 CONSTRAINT pk_Weapons PRIMARY KEY(id),
 CONSTRAINT fk_Weapons_company FOREIGN KEY(company_id) REFERENCES Company(id),
 CONSTRAINT fk_Weapons_ammo FOREIGN KEY(ammo_id) REFERENCES Ammo(id)
    );

Об иностранных ключах: https://www.techonthenet.com/oracle/foreign_keys/foreign_keys.php
О первичных ключах: https://www.techonthenet.com/oracle/primary_keys.php

0 голосов
/ 04 мая 2019

Вот рабочий пример. Я создал таблицу AMMO (описание которой вы не опубликовали, поэтому я использовал только столбец ID, чтобы ограничение внешнего ключа не нарушалось). Обратите внимание на комментарии, которые я написал в коде.

SQL> create table ammo
  2    ( id  VARCHAR2(10),
  3      CONSTRAINT pk_ammo PRIMARY KEY(id) );

Table created.

SQL> CREATE TABLE Company
  2    ( id   VARCHAR(3),
  3      name VARCHAR(30),                   --> switch from CHAR to VARCHAR2
  4      CONSTRAINT pk_Company PRIMARY KEY(id) );

Table created.

SQL> CREATE TABLE Weapons
  2    ( id         NUMBER(4),
  3      name       VARCHAR2(30),
  4      damage     NUMBER(4),
  5      company_id VARCHAR2(3),             --> should match COMPANY.ID datatype
  6      ammo_id    VARCHAR2(10),            --> should match AMMO.ID datatype
  7      CONSTRAINT pk_Weapons PRIMARY KEY(id),
  8      CONSTRAINT fk_Weapons_company FOREIGN KEY(company_id) REFERENCES Company(id),
  9      CONSTRAINT fk_Weapons_ammo FOREIGN KEY(ammo_id) REFERENCES ammo(id) );

Table created.

SQL>

В ограничении ссылочной целостности вы должны сопоставлять типы данных столбцов внешнего и первичного ключей. Нет смысла иметь VARCHAR2(10) в таблице сведений, которая указывает на столбец VARCHAR2(3) в основной таблице; вы все равно не сможете поместить в столбец таблицы подробностей более 3 символов (ограничение внешнего ключа не позволит вам).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...