MySQL Ограничение внешнего ключа несовместимо - PullRequest
0 голосов
/ 16 марта 2020

MySQL Версия 8.0.17

Полная ошибка:

Ссылка на столбец 'groupLineId' и ссылочный столбец 'groupLineId' в ограничении внешнего ключа 'salesItemLine-groupLine' несовместимы

Я пытаюсь связать две таблицы с помощью groupLineId, которые оба являются NOT NULL VARCHAR (12). Я не уверен, почему я получаю ошибку. У меня есть несколько других связей с внешними ключами, как это в моей БД.

Я использую следующий код для генерации двух таблиц. (Примечание: код для таблицы счетов не показан)

CREATE TABLE IF NOT EXISTS `reports`.`groupLine` (
  `groupLineId` VARCHAR(12) NOT NULL,
  `lineNum` INT NOT NULL,
  `invoiceId` VARCHAR(12) NOT NULL,
  PRIMARY KEY (`groupLineId`, `lineNum`, `invoiceId`),
  INDEX `groupLine-invoice_idx` (`invoiceId` ASC) VISIBLE,
  CONSTRAINT `groupLine-invoice`
    FOREIGN KEY (`invoiceId`)
    REFERENCES `reports`.`invoice` (`invoiceId`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


CREATE TABLE IF NOT EXISTS `reports`.`salesItemLine` (
  `groupLineId` VARCHAR(12) NOT NULL,
  `lineNum` INT NOT NULL,
  `description` VARCHAR(256) NULL,
  `amount` DECIMAL NULL,
  `detailType` VARCHAR(45) NULL,
  PRIMARY KEY (`groupLineId`, `lineNum`),
  INDEX `salesItemLine-groupLine_idx` (`groupLineId` ASC) VISIBLE,
  CONSTRAINT `salesItemLine-groupLine`
    FOREIGN KEY (`groupLineId`)
    REFERENCES `reports`.`groupLine` (`groupLineId`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

1 Ответ

0 голосов
/ 16 марта 2020

Если кто-то сталкивался с этим, моя проблема заключалась в том, как я вносил изменения и использовал функцию «Вперед» в MySQL Workbench. Первоначально я создал базу данных с идентификатором groupLineId типа INT. Затем я изменил модель, чтобы сделать groupLineId в обеих таблицах на VARCHAR (12). Затем, когда я запустил «Forward Engineer», он сначала записал бы новую таблицу groupLine и изменил тип groupLineId на VARCHAR (12), а затем сломал бы существующий ключ FROGIEN с таблицей salesItemLine, которая не была обновлена ​​и все еще имеет тип groupeLineId как INT.

Решение состояло в том, чтобы УДАЛИТЬ обе таблицы перед повторным запуском форвард-инжиниринга. (Или, по крайней мере, вручную сбросив существующие ограничения)

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