ORA-00907: «отсутствует правая скобка»

#sql #oracle #create-table

Вопрос:

Во-первых, я приношу извинения за повторный вопрос, но информация по старым темам не работала в моем коде oraclesql, а во-вторых, могут быть некоторые синтаксические ошибки, я изучал mysql в школе в прошлом семестре, но сейчас мы изучаем oraclesql со старой информацией mysql на уроке, поэтому я немного запутался.

Итак, мой вопрос в том, что я хочу создать 3 связанные таблицы (роли в фильмах-актер), но мне не хватает правой круглой скобки. попытка подключить таблицу приведений к таблице фильмов с помощью внешнего ключа и таблицы актеров к таблице приведений. Что я делаю не так? как там спагетти?

 CREATE TABLE Movie (
    movie_id NUMBER(7) NOT NULL,
    movie_name varchar2(50) NOT NULL ,
    movie_director varchar2(50) NOT NULL ,
    movie_year INT(4) NOT NULL ,
    movie_duration INT(3) ,
    movie_language varchar2(15) ,
    movie_rating number(4,2) , 
    PRIMARY KEY(movie_id),
    CONSTRAINT is_unique UNIQUE(movie_id),
    CONSTRAINT movie_id_checker CHECK(movie_id>0 and movie_id<=9999999)
);

CREATE TABLE Casts (
    movie_id_fk INT(7) FOREIGN KEY REFERENCES Movie(movie_id) ,
    
    cast_id INT(7) NOT NULL, 
    actor_fullname varchar2(50) NOT NULL ,
    actor_role varchar2(50) ,
    PRIMARY KEY(cast_id),
    CONSTRAINT is_unique UNIQUE(cast_id),
    CONSTRAINT cast_id_checker CHECK(cast_id>0 and cast_id<=9999999)
);

CREATE TABLE Actor (
    cast_id_fk INT(7) FOREIGN KEY REFERENCES Casts(cast_id) ,
    
    actor_id INT(7) NOT NULL,
    actor_name CHAR(30) ,
    actor_surname CHAR(25) ,
    actor_gender CHAR(5) ,
    actor_age CHAR(3) CONSTRAINT real_age_check CHECK(actor_age>0 AND actor_age<=150),
    PRIMARY KEY(actor_id),
    CONSTRAINT is_unique UNIQUE(actor_id),
    CONSTRAINT actor_id_checker CHECK(actor_id>0 and actor_id<=9999999)
)
 

Комментарии:

1. Почему вы пропускаете точку с запятой после создания слепков и создания актера ?

2. извините, что я виноват :/ добавлено сейчас

3. работает ли INT(4) в oracle ?

4. @praveen похоже, что это не так 😀 благодаря мистеру mt0 я узнал, что

Ответ №1:

Ошибки заключаются в:

  • INT или NUMBER(4,0) и не INT(4)
  • У вас не может быть уникального ключа и первичного ключа в одном столбце.
  • Встроенный внешний ключ просто нуждается в REFERENCES ключевом слове и не нуждается FOREIGN KEY .

Другие вопросы:

  • Вы, вероятно, не хотите, чтобы имя/фамилия актера CHAR были строками фиксированной длины, и хотите использовать переменную длину VARCHAR2 .
  • Вероятно, вы хотите, чтобы гендер был кодом из фиксированного списка (который может быть таким длинным или коротким, каким вы сочтете подходящим для описания действующих лиц), а не строкой.
  • Вероятно, вы не хотите иметь AGE столбец, так как он устареет, как только наступит первый день рождения актера; вместо этого у вас есть DATE_OF_BIRTH столбец, который является DATE типом данных, а затем вы можете рассчитать возраст по мере необходимости.
  • Использование имени таблицы в качестве префикса для каждого столбца-пустая трата нажатий клавиш; вам было бы лучше просто назвать столбцы так, как они есть, без префикса. Аналогично с fk суффиксом as.
  • Если вы используете значение a NUMBER(7,0) для id значений, вам не нужно проверять, что оно меньше или равно 9999999, так как большее значение невозможно; однако у вас могут быть нулевые или отрицательные значения, поэтому ограничение проверки для нижней границы все еще может быть действительным.
  • Если вы используете Oracle 12c или более позднюю версию, вам, вероятно, следует использовать IDENTITY столбец для id значений, если только вы не берете id значения у третьей стороны.
 CREATE TABLE Movie (
    id       NUMBER(7,0) NOT NULL,
    name     varchar2(50) NOT NULL ,
    director varchar2(50) NOT NULL ,
    year     NUMBER(4,0) NOT NULL ,
    duration NUMBER(3,0),
    language varchar2(15) ,
    rating   number(4,2) , 
    PRIMARY KEY(id),
    CONSTRAINT movie_id_checker CHECK(id>0)
);

CREATE TABLE Casts (
    movie_id INT REFERENCES Movie(id) ,
    id       NUMBER(7,0) NOT NULL, 
    fullname varchar2(50) NOT NULL ,
    role     varchar2(50) ,
    PRIMARY KEY(id),
    CONSTRAINT cast_id_checker CHECK(id>0)
);

CREATE TABLE Actor (
    cast_id       NUMBER(7,0) REFERENCES Casts(id) ,
    id            NUMBER(7,0) NOT NULL,
    name          VARCHAR2(30) ,
    surname       VARCHAR2(25) ,
    gender        CHAR(1)
                  CHECK ( gender IN ( 'M', 'F', 'X', 'Y', 'Z' ) ),
    date_of_birth DATE
                  CONSTRAINT real_age_check CHECK(date_of_birth >= DATE '1870-01-01' ),
    PRIMARY KEY(id),
    CONSTRAINT actor_id_checker CHECK(id>0)
);
 

бд<>скрипка <>здесь

Комментарии:

1. 1-)НОМЕР cast_id(7,0) НЕ РАВЕН НУЛЮ, 2-) как в mysql Первичный ключ = Уникальный ключ Не равен нулю 3-) НОМЕР cast_id_fk(7,0) ССЫЛКИ НА приведения(cast_id) , как это?

2. примечание: большое вам спасибо, приятель, это наконец-то работает и кажется, что да, как в mysql Первичный ключ = Уникальный ключ Не нуль

3. я использовал имя таблицы в качестве префикса для большей понятности, но я больше не буду этого делать, ошибка новичка :/

4. @blawien Вы можете добавлять имена столбцов к имени таблицы, но это необязательно и просто увеличит количество, которое вам нужно ввести; однако, если это поможет вам сделать код правильным и сделать меньше ошибок, то дополнительный ввод имеет для вас значение. Итак, приставка к имени таблицы не является неправильной, и вы можете игнорировать этот совет …. но это не всем по вкусу (именно поэтому я добавил этот комментарий).