Ссылка на внешний ключ Составной первичный ключ - PullRequest
1 голос
/ 06 апреля 2019

База данных будет хранить информацию об аппаратных устройствах и их собранных данных.Я создал таблицу устройств для хранения доступных аппаратных устройств:

CREATE TABLE IF NOT EXISTS `devices` (
  `deviceID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `deviceType` int(10) unsigned NOT NULL,
  `updateFrequency` int(10) unsigned NOT NULL,
  PRIMARY KEY (`deviceID`,`deviceType`)
)

Идентификатор устройства будет соответствовать реальному идентификатору оборудования (от 1 до 12).Поскольку существует два типа аппаратных устройств, я подумал, что было бы целесообразно создать deviceType, который будет иметь значение 0 или 1, в зависимости от того, какое аппаратное устройство, и создать составной первичный ключ.

Для хранения этих данных я создал другойТаблица.

CREATE TABLE IF NOT EXISTS `data` (
  `dataID` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `deviceID` int(11) unsigned NOT NULL,
  `payload` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
  PRIMARY KEY (`dataID`),
  KEY `fk_data_devices` (`deviceID`),
  CONSTRAINT `fk_data_devices` 
    FOREIGN KEY (`deviceID`) 
    REFERENCES `devices` (`deviceID`) 
    ON DELETE CASCADE
)

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

Спасибо зазаранее!

1 Ответ

2 голосов
/ 06 апреля 2019

У вас есть родительская таблица с составным первичным ключом в столбцах (deviceID, deviceType). Если вы хотите создать дочернюю таблицу, вам необходимо:

  • создать один столбец в дочерней таблице для каждого столбца, который является частью первичного ключа в родительской таблице (deviceID, deviceType)
  • создать составной внешний ключ, который ссылается на этот кортеж столбцов на соответствующий кортеж столбца в родительской таблице

Рассмотрим:

CREATE TABLE IF NOT EXISTS `data` (
    `dataID` int(11) unsigned NOT NULL AUTO_INCREMENT,
    `deviceID` int(11) unsigned NOT NULL,
    `deviceType` int(10) unsigned NOT NULL,
    `payload` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
    PRIMARY KEY (`dataID`),
    CONSTRAINT `fk_data_pk` 
        FOREIGN KEY (`deviceID`, `deviceType`) 
        REFERENCES `devices` (`deviceID`, `deviceType`) 
        ON DELETE CASCADE
);

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

Учитывая эти данные в родительской таблице:

deviceID  deviceType
1         0
2         1

Если вы создадите отдельный внешний ключ для каждого столбца, они позволят вам вставить запись в дочернюю таблицу со значениями, такими как (1, 1) или (2, 0). Составной внешний ключ не допустит этого, поскольку эти конкретные кортежи не существуют в исходной таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...