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

0
blawien 9 Апр 2021 в 22:17

1 ответ

Лучший ответ

Ошибки:

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

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

  • Вероятно, вы не хотите, чтобы имя / фамилия актера представляли собой строки фиксированной длины CHAR и хотите использовать строки переменной длины VARCHAR2.
  • Вероятно, вы хотите, чтобы пол был кодом из фиксированного списка (который может быть настолько длинным или коротким, насколько вы сочтете подходящим для описания актеров), а не строкой.
  • Вы, вероятно, не захотите иметь столбец AGE, поскольку он устареет, как только исполнится первый день рождения актера; вместо этого используйте столбец DATE_OF_BIRTH, который является типом данных DATE, и тогда вы можете вычислить возраст по мере необходимости.
  • Использование имени таблицы в качестве префикса для каждого столбца - пустая трата нажатий клавиш; лучше называть столбцы такими, какие они есть, без префикса. Аналогично с суффиксом fk.
  • Если вы используете 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)
);

db <> fiddle здесь

2
MT0 9 Апр 2021 в 19:47