Код ошибки 1005. Невозможно создать таблицу: «берет» и «учит» - PullRequest
0 голосов
/ 04 мая 2019

Буду признателен за помощь. Невозможно создать таблицу «Преподает» и «берет».

CREATE DATABASE university;
use university;

CREATE TABLE classroom(
building VARCHAR(20), 
room_number INT,
capacity INT,
PRIMARY KEY (building,room_number)
) ;

CREATE TABLE Sales(
item VARCHAR(20),
color VARCHAR(20),
clothes_size VARCHAR(20),
quantity INT,
 PRIMARY KEY (item,color,clothes_size,quantity)
);

CREATE TABLE Department (
dept_name VARCHAR(20),
building VARCHAR(20),
budget INT,
FOREIGN KEY (building) references classroom(building),
PRIMARY KEY (dept_name,building,budget)
);

CREATE TABLE Course (
course_id VARCHAR(20)PRIMARY KEY,
title VARCHAR(20),
dept_name VARCHAR(20),
credits INT,
FOREIGN KEY (dept_name) references Department(dept_name)
);

CREATE TABLE Instructor(
ID VARCHAR(20) PRIMARY KEY,
neme VARCHAR(20),
dept_name VARCHAR(20),
salary INT,
FOREIGN KEY (dept_name) references Department(dept_name)
);

CREATE TABLE section(
  course_id VARCHAR(20),
  sec_id INT,
  semester VARCHAR(20),
  year1 INT,
  building1 VARCHAR(20),
  room_number INT,
  time_slot_id CHAR,
  FOREIGN KEY (course_id) REFERENCES Course(course_id),
  FOREIGN KEY (building1,room_number) references classroom(building,room_number),
  PRIMARY KEY(course_id,sec_id,semester,year1)
);

CREATE TABLE Teaches(
ID VARCHAR(20),
course_id VARCHAR(20),
sec_id VARCHAR(20),
semester VARCHAR(20),
year1 INT,
FOREIGN KEY (ID) references Instructor(ID),
FOREIGN KEY (sec_id) references section(sec_id),
FOREIGN KEY (semester,year1) references section(semester,year1),
FOREIGN KEY (course_id) references course(course_id),
PRIMARY KEY (ID,course_id,sec_id,year1,semester)
);

CREATE TABLE student(
ID VARCHAR(20) PRIMARY KEY,
name1 VARCHAR(20),
dept_name VARCHAR(20),
tot_cred INT);

CREATE TABLE Takes(
ID VARCHAR(20), 
course_id VARCHAR(20),
sec_id INT,
semester VARCHAR(20),
year1 INT,
grade char,
FOREIGN KEY (ID) references student(ID),
FOREIGN KEY (sec_id) references section(sec_id),
FOREIGN KEY (semester) references section(semester),
FOREIGN KEY (year1) references section(year1),
FOREIGN KEY (course_id) references course(course_id),
PRIMARY KEY(ID,sec_id,semester,year1,course_id)
);

1 Ответ

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

Ссылки на внешние ключи должны иметь те же типы, что и первичные ключи, на которые они ссылаются.Итак, рассмотрим:

CREATE TABLE Department (
    dept_name VARCHAR(20),
    building VARCHAR(20),
    budget INT,
    FOREIGN KEY (building) references classroom(building),
    PRIMARY KEY (dept_name,building,budget)
);

CREATE TABLE Instructor (
    ID VARCHAR(20) PRIMARY KEY,
    neme VARCHAR(20),
    dept_name VARCHAR(20),
    salary INT,
    FOREIGN KEY (dept_name) references Department(dept_name)
);

Первичный ключ для Department состоит из трех компонентов - dept_name, building, budget.Тем не менее, ссылка имеет только один компонент.Они не могут совпадать;число не является правильным, тем более типы.

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

create table buildings (
    building_id int auto_increment primary key,
    building varchar(20),
    constraint unq_buildings_building unique(building)
);

create table classrooms (
    classroom_id int auto_increment primary key,
    building_id int,
    room_number int,
    capacity int,
    constraint fk_classrooms_building_id foreign key (building_id) references buildings (building_id)
) ;

create table Departments (
    department_id int auto_increment primary key,
    dept_name varchar(20),
    building_id int,
    budget INT,
    constraint fk_departments_building_id foreign key (building_id) references buildings(building_id)
);

create table instructors (
    instructor_id int auto_increment primary key,
    id varchar(20) unique,
    name varchar(20),
    department_id int,
    salary int,
    foreign key instructors_department_id foreign key (department_id) references departments (department_id)
);

Это просто небольшой пример ваших таблиц.Но вот некоторые правила, которым я следую:

  • Имена таблиц множественного числа.
  • У них есть первичный ключ, который представляет собой форму единственного числа, за которой следует _id (или Id).
  • Ссылки на внешние ключи только для первичных ключей.
  • Насколько это возможно, внешние ключи и первичные ключи имеют одинаковые имена.
  • Явные ограничения даны имена.Имена соответствуют очень точному соглашению об именах.

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

Это должно дать вам несколько идей о том, как построить вашу базу данных.

...