Ошибка создания внешнего ключа для числа GPU (проверьте типы данных) - столбцы точно такие же, и я все еще получаю эту проблему - PullRequest
0 голосов
/ 09 апреля 2019

Я настраиваю базу данных для класса информатики, используя PHPMyAdmin (без SQL или чего-либо еще, просто помещая это прямо в PHPMyAdmin), и в настоящее время я пытаюсь установить внешний ключ в одной из моих таблиц в первичный ключ в другой таблице. Я продолжаю получать эту ошибку: Ошибка создания внешнего ключа для числа графических процессоров (проверьте типы данных). Я понял, что это был TINYINT, а другой - INT, поэтому я изменил его, чтобы они оба были INT. Я также заметил, что один был подписан, а другой нет, поэтому я сделал их обоих без подписи. Имя ограничения внешнего ключа является уникальным (я даже изменил его на всякий случай, если это не так), и я, честно говоря, сейчас в замешательстве, почему он это делает. Я даже зашел так далеко, что удалил одну из таблиц (ту, у которой есть первичный ключ) и полностью переделал ее, просто чтобы иметь ту же проблему. Любая помощь будет очень полезна.

Ниже приведен код SQL для создания таблицы RUNNING_GPUS с первичным ключом numberGPU:

CREATE TABLE `RUNNING_GPUS` (
`rigID` varchar(12) NOT NULL,
 `numberofGPUs` int(2) unsigned NOT NULL,
 `runningGPUs` int(2) unsigned NOT NULL,
 PRIMARY KEY (`rigID`,`numberofGPUs`),
 KEY `rigID` (`rigID`),
 CONSTRAINT `rig-fk-for-running` FOREIGN KEY (`rigID`) REFERENCES `RIGS` (`rigID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

Ниже приведен код SQL для создания таблицы RIGS с внешним ключом:

 CREATE TABLE `RIGS` (
 `rigID` varchar(12) NOT NULL,
 `rigName` varchar(50) NOT NULL,
 `osVersion` varchar(10) NOT NULL,
 `numberofGPUs` int(2) unsigned NOT NULL,
 `rigLocation` varchar(50) NOT NULL,
 `lastPing` varchar(4) NOT NULL,
 `lastReboot` varchar(4) NOT NULL,
 `latestCrash` varchar(4) NOT NULL,
 `lostRevenuePerHour` decimal(5,4) unsigned DEFAULT NULL,
 `hardwareErrorType` varchar(100) DEFAULT NULL,
 `hardwareErrorMean` decimal(7,3) unsigned DEFAULT NULL,
 PRIMARY KEY (`rigID`),
 CONSTRAINT `error-type-for-rigs` FOREIGN KEY (`hardwareErrorType`) REFERENCES `HARDWARE_ERRORS` (`hardwareErrorType`),
 CONSTRAINT `revenue-for-rigs` FOREIGN KEY (`lostRevenuePerHour`) REFERENCES `LOST_REVENUES` (`lostRevenuePerHour`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

Я также добавляю внешние ключи через PHPMyAdmin, но когда я пытался сделать следующий код:

ALTER TABLE `RIGS`
ADD CONSTRAINT `test77`
FOREIGN KEY (`numberofGPUs`) REFERENCES `RUNNING_GPUS` (`numberofGPUs`);

это выдало мне ошибку, сказав: # 1005 - Невозможно создать таблицу aetrigg_db. RIGS (ошибка: 150 "Неправильно сформировано ограничение внешнего ключа")

ETA: Я какое-то время возился с SQL Fiddle, и все таблицы в нем. Все работает, КРОМЕ для этого числа GPU. Вы можете получить доступ к скрипке здесь: http://sqlfiddle.com/#!9/ec079e. Я просто добавляю ALTER TABLE сверху и добавляю ее внизу, и каждый раз выдает ошибку, говоря, что не может добавить внешний ключ. Таблица RIGS является родительской, а RUNNING_GPUS является дочерней для столбца rigID, но RUNNING_GPUS является родительской, а RIGS является дочерней для столбца numberofGPUs. Я попытался настроить его, сделав сначала RIGS, затем RUNNING_GPUS, а затем изменив таблицу RIGS, но это не работает.

1 Ответ

1 голос
/ 09 апреля 2019

Поменять порядок в первичном ключе RUNNING_GPUS

изменение
ПЕРВИЧНЫЙ КЛЮЧ (rigID, numberofGPUs),
до
ПЕРВИЧНЫЙ КЛЮЧ (numberofGPUs, rigID),

Внешние ключи должны быть ключом, своего рода, и, очевидно, mysql не считает вторичные части ключа типом ключа.

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