Составной ключ mySQL, первичный ключ, уникальный ключ и ссылки на составной ключ - PullRequest
1 голос
/ 04 октября 2019

У меня есть вопрос о конкретных ключах и как на них ссылаться. Я учусь, и это было бы очень полезно, спасибо заранее.

В SQL, в чем разница между этими стилями?

Кроме того, при создании составного первичного ключа внешний также должен иметьсоставной внешний ключ для соответствия составному первичному ключу. В первой таблице я могу ссылаться на нее, если я добавил в спецификацию уникальный без создания стороннего композита, но если я удаляю уникальный, я не могу ссылаться на первичный ключ, так как он является составным. Почему добавление уникального позволяет мне ссылаться на составной первичный ключ в первой таблице, не имея внешнего составного ключа? Кроме того, почему я могу добавить уникальные ключи в составной ключ?

Кроме того, будет ли это похоже на добавление составного ключа UNIQUE KEY, как во 2-й таблице? Третья таблица не позволяет мне ссылаться на эту таблицу, поскольку у меня должен быть составной внешний ключ.

CREATE TABLE college.LocationNTime(
    CourseN INT,
    `Quarter` VARCHAR(30) UNIQUE,
    DayTime VARCHAR(30) UNIQUE,
    RoomN INT,
    PRIMARY KEY (CourseN, `Quarter`, DayTime),
    FOREIGN KEY (CourseN) REFERENCES Course(CourseN)
);
CREATE TABLE college.LocationNTime(
    CourseN INT,
    `Quarter` VARCHAR(30),
    DayTime VARCHAR(30),
    RoomN INT,
    PRIMARY KEY (CourseN),
    UNIQUE KEY(`Quarter`, DayTime),
    FOREIGN KEY (CourseN) REFERENCES Course(CourseN)
);
CREATE TABLE college.LocationNTime(
    CourseN INT,
    `Quarter` VARCHAR(30),
    DayTime VARCHAR(30),
    RoomN INT,
    PRIMARY KEY (CourseN, `Quarter`, DayTime),
    FOREIGN KEY (CourseN) REFERENCES Course(CourseN)
);

1 Ответ

0 голосов
/ 04 октября 2019
PRIMARY KEY (CourseN, `Quarter`, DayTime),
FOREIGN KEY (CourseN) REFERENCES Course(CourseN)

В этой конструкции вы создаете составной первичный ключ со столбцами (CourseN, Quarter DayTime). Это подразумевает, что любая комбинация значений этих трех столбцов должна быть уникальной в таблице. Кроме того, вы указываете, что CourseN является внешним ключом, который ссылается на столбец синонимов в таблице Course, поэтому каждое значение столбца CourseN в ссылочной таблице LocationNTime должно присутствовать в указанной таблице Course.

Это похоже на действительный набор, где LocationNTime подобен зависимой таблице Course (как дочерняя таблица или тому подобное).


PRIMARY KEY (CourseN),
UNIQUE KEY(`Quarter`, DayTime),
FOREIGN KEY (CourseN) REFERENCES Course(CourseN)

Здесь CourseN является первичным ключом таблицы, поэтому каждое значение в этом столбце должно быть уникальным. Но это также внешний ключ для Course. На самом деле это не имеет смысла с точки зрения нормализации: если каждая запись в LocationNTime относится к уникальной записи в Course, тогда зачем создавать две таблицы вместо хранения всех данных в одной записи в Course?

Кроме того, вы создаете уникальное ограничение для ( Quarter , DayTime), что означает, что комбинация значений в этих столбцах уникальна.

Этот дизайн выглядит некорректно.


Рассмотрим следующий набор данных:

CourseN    Quarter    DayTime
1          1          14:00:00
1          2          14:10:00
1          3          14:00:00
1          4          14:10:00

Первый дизайн разрешит этот набор данных, а второй - нет, поскольку дубликаты в CourseN. Следующий набор данных также не будет разрешен, так как в (Quarter, DayTime) есть дубликаты:

CourseN    Quarter    DayTime
1          1          14:00:00
2          2          14:10:00
3          1          14:00:00
4          2          14:10:00

Я считаю, что первый дизайн, вероятно, вам нужен.


Наконец:Вы, кажется, думаете, что столбец с ограничением внешнего ключа (здесь LocationNTime(CourseN)) должен быть UNIQUE: это не так. Единственное, что ему нужно, - это индекс (и MySQL создает его для вас, когда вы все равно его объявляете). Это столбец, на который ссылается внешний ключ (здесь Course(CourseN)), который должен быть уникальным.

...