#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 Вы можете добавлять имена столбцов к имени таблицы, но это необязательно и просто увеличит количество, которое вам нужно ввести; однако, если это поможет вам сделать код правильным и сделать меньше ошибок, то дополнительный ввод имеет для вас значение. Итак, приставка к имени таблицы не является неправильной, и вы можете игнорировать этот совет …. но это не всем по вкусу (именно поэтому я добавил этот комментарий).