Ошибка 1822 mysql

I found some threads about the error. But all the solutions doesn't work for me. I created 2 tables a user table and one for articles. Now I want to store the user that created the article and the...

I found some threads about the error. But all the solutions doesn’t work for me.

I created 2 tables a user table and one for articles. Now I want to store the user that created the article and the one who is the last modifier.

CREATE TABLE IF NOT EXISTS `testDb`.`users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `nickname` VARCHAR(255) NULL,
  `first_name` VARCHAR(255) NULL,
  `last_name` VARCHAR(255) NULL,
  `e_mail` VARCHAR(255) NOT NULL,
  `activated` TINYINT(1) NOT NULL DEFAULT 0,
  `birth_date` DATE NULL,
  `locked` TINYINT(1) NOT NULL DEFAULT 0,
  `locked_date_time` DATETIME NULL,
  `street` VARCHAR(255) NULL,
  `street_number` VARCHAR(255) NULL,
  `city` VARCHAR(255) NULL,
  `postal_code` VARCHAR(255) NULL,
  `country` VARCHAR(255) NULL,
  `phone` VARCHAR(255) NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `user_id_UNIQUE` (`id` ASC)
)
ENGINE = InnoDB
AUTO_INCREMENT = 1;


CREATE TABLE IF NOT EXISTS `testDb`.`articles` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NULL,
  `description` VARCHAR(255) NULL,
  `create_user` INT ZEROFILL NOT NULL,
  `create_date_time` DATETIME NULL,
  `last_modifie_user` INT ZEROFILL NOT NULL,
  `last_modifie_date_time` DATETIME NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `article_id_UNIQUE` (`id` ASC),
  INDEX `fk_articles_users1_idx` (`create_user` ASC),
  INDEX `fk_articles_users2_idx` (`last_modifie_user` ASC)
)
ENGINE = InnoDB
AUTO_INCREMENT = 1;


ALTER TABLE `testDb`.`articles`
  ADD CONSTRAINT `fk_articles_users1`
    FOREIGN KEY (`create_user`)
    REFERENCES `testDb`.`users` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  ADD CONSTRAINT `fk_articles_users2`
    FOREIGN KEY (`last_modifie_user`)
    REFERENCES `testDb`.`users` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

I get the following error, but I didn’t understand why I should have a index for that.

Error Code: 1822. Failed to add the foreign key constaint. Missing index for constraint ‘fk_articles_users1’ in the referenced table ‘users’

I actived

SHOW ENGINE innodb STATUS;

but this doesn’t shows any erros.

Я пытаюсь создать таблицу с составным внешним ключом, но постоянно получаю ошибку Error Code: 1822. Failed to add the foreign key constraint. Missing index for constraint ‘fk_contractdateshistoric_contractdates_multiple’ in the referenced table ‘contractdates’

Я использую MySQL v8.0.16

Я проверил, различаются ли типы столбцов, и я не уверен, в чем еще может быть проблема.

Вот таблицы, которые составляют проблему. Все таблицы созданы успешно, но последняя, ​​содержащая составной ключ, вызывает проблему.

CREATE TABLE `contracts` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(100) DEFAULT NULL,
  `CreationDate` datetime DEFAULT NULL,
  `CreatedBy` varchar(30) DEFAULT NULL,
  `CompletionDate` date DEFAULT NULL,
  `Comments` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`ID`)
);

CREATE TABLE `fieldheading` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `fieldTypeID` int(11) DEFAULT NULL,
  `fieldCode` int(11) DEFAULT NULL,
  `fieldHeading` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`ID`)
);

CREATE TABLE `contractdates` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
  `DateValue` datetime DEFAULT NULL,
  `ContractID` int(11) NOT NULL,
  `FieldHeadingID` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  UNIQUE KEY `uq_contractdates_contractID_FieldHeading_ID` (`ContractID`,`FieldHeadingID`),
  KEY `fk_contractdates_contracts_id_idx` (`ContractID`),
  KEY `fk_contractdates_fieldheading_id_idx` (`FieldHeadingID`),
  CONSTRAINT `fk_contractdates_fieldheading_id` FOREIGN KEY (`FieldHeadingID`) REFERENCES `fieldheading` (`id`),
  CONSTRAINT `fk_contractdates_contracts_id` FOREIGN KEY (`ContractID`) REFERENCES `contracts` (`id`)
) COMMENT='Table to hold the dates for a contract, one row is one date for a specific contract';

CREATE TABLE `contractdateshistoric` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `ContractID` int(11) NOT NULL,
  `ContractDateCurrentID` int(11) NOT NULL,
  `FieldHeadingID` int(11) NOT NULL,
  `ChangedByID` int(11) NOT NULL,
  `DateValue` datetime NOT NULL,
  `TimeStampChanged` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`),
  KEY `fk_contractdateshistoric_contractdates_mutiple_idx` (`ContractID`, `FieldHeadingID`, `ContractDateCurrentID`),
  CONSTRAINT `fk_contractdateshistoric_contractdates_multiple` FOREIGN KEY (`ContractID`, `FieldHeadingID`, `ContractDateCurrentID`) REFERENCES `contractdates` (`contractid`, `fieldheadingid`, `id`)
) COMMENT='Audit trail of the dates';

Перейти к ответу
Данный вопрос помечен как решенный


Ответы
3

Он пытается сказать вам «Вы не создали необходимый уникальный индекс для контрактных дат, который охватывает столбцы (contractid, fieldheadingid, id), поэтому я не могу создать внешний ключ для контрактных дат, который ссылается на этот набор столбцов при определении единственной родительской строки»

Я не уверен, почему вы создаете fk, который ссылается на 3 столбца, когда у contractdates есть pk, который является просто столбцом идентификатора.

Если в исторических записях contractdates указана одна запись contractdates в качестве родителя, в исторической записи должен быть столбец contractdateid, который ссылается на contractdates.id — нет необходимости в нескольких столбцах. Скопируйте шаблон, который вы использовали для связи даты контракта с его родительским контрактом, и все будет в порядке.

Я попытался создать ключи отдельно для столбцов. Найдите обновленный запрос:

CREATE TABLE `contractdateshistoric` (
    `ID` INT(11) NOT NULL AUTO_INCREMENT,
    `ContractID` INT(11) NOT NULL,
    `ContractDateCurrentID` INT(11) NOT NULL,
    `FieldHeadingID` INT(11) NOT NULL,
    `ChangedByID` INT(11) NOT NULL,
    `DateValue` DATETIME NOT NULL,
    `TimeStampChanged` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`ID`),
    KEY `fk_contractdateshistoric_contractdates_mutiple_idx` (`ContractID`),
    KEY `fk_contractdateshistoric_contractdates_mutiple_idx1` (`FieldHeadingID`),
    KEY `fk_contractdateshistoric_contractdates_mutiple_idx2` (`ContractDateCurrentID`),
    CONSTRAINT `fk_contractdateshistoric_contractdates_multiple` FOREIGN KEY (`ContractID`)
    REFERENCES `contractdates` (`contractid`),
    CONSTRAINT `fk_contractdateshistoric_contractdates_multiple1` FOREIGN KEY (`FieldHeadingID`)
    REFERENCES `contractdates` (`fieldheadingid`),
    CONSTRAINT `fk_contractdateshistoric_contractdates_multiple2` FOREIGN KEY (`ContractDateCurrentID`)
    REFERENCES `contractdates` (`id`)
);

Это работает нормально.

Поскольку вы используете Composite FK в таблице, попробуйте также добавить составной индекс.

  KEY `fk_contractdates_mutiple_idx` (`ContractID`,`FieldHeadingID`,`ID`)

Весь оператор создания

CREATE TABLE `contractdates` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
  `DateValue` datetime DEFAULT NULL,
  `ContractID` int(11) NOT NULL,
  `FieldHeadingID` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `fk_contractdates_contracts_id_idx` (`ContractID`),
  KEY `fk_contractdates_fieldheading_id_idx` (`FieldHeadingID`),
  KEY `fk_contractdates_mutiple_idx` (`ContractID`,`FieldHeadingID`,`ID`),
  CONSTRAINT `fk_contractdates_fieldheading_id` FOREIGN KEY (`FieldHeadingID`) REFERENCES `fieldheading` (`id`),
  CONSTRAINT `fk_contractdates_contracts_id` FOREIGN KEY (`ContractID`) REFERENCES `contracts` (`id`)
) COMMENT='Table to hold the dates for a contract, one row is one date for a specific contract';

Другие вопросы по теме

Вопрос:

Я пытаюсь добавить внешний ключ к моей таблице расписания полетов, но он терпит неудачу, но я действительно не знаю, почему. Внешний ключ должен ссылаться на атрибут txtAC_tag из таблицы tblAircraft, который является частью основного ключа! Таким образом, tblAircraft индексируется (первичный ключ – это комбинированный ключ, который состоит из idAC и txtAC_tag → может ли проблема с объединенным Первичным ключом?), И тип данных атрибута соответствует.

Вот мои объявления таблиц и объявления внешнего ключа:

create table if not exists tblAircrafts(
idAC       int not null auto_increment,
txtAC_tag  varchar(255) not null,
txtAC_type varchar(255) not null,
primary key(idAC, txtAC_tag));

create table if not exists tblFlightSchedule(
ID int not null auto_increment,
datDate date,
txtFrom varchar(255),
txtTo   varchar(255),
txtFlight varchar(255),
numFlight_time_decimal decimal(4,2),
txtAC_tag varchar(255) not null,
txtAC_type varchar(255) not null,
numSeatCapacity int unsigned,
numLoad int unsigned, -- auslastung
numDirt decimal(20,19),
numTotalFlightTime decimal(50,5),
numCumDirt decimal(20,15),
primary key(ID));

alter table tblflightschedule
add foreign key(txtAC_tag) references tblaircrafts(txtAC_tag);

И вот сообщение ERROR:

Error Code: 1822. Failed to add the foreign key constaint. Missing index for constraint '' in the referenced table 'tblaircrafts'

Какие-либо предложения? Я ценю любую помощь, которую вы можете мне дать, спасибо!

Лучший ответ:

Проблема здесь:

add foreign key(txtAC_tag) references tblaircrafts(txtAC_tag);

здесь вы привязываете txtAC_tag к txtAC_tag таблицы tblaircrafts но в tblaircrafts столбец txtAC_tag является ни unique ни primary, почему он показывает ошибку.

Для отношения внешних ключей столбец родительских таблиц, на котором вы создаете отношение, должен быть unique или primary и они должны иметь одинаковый тип данных.

Чтобы устранить это, сделайте столбец txtAC_tag уникальным.

Ответ №1

Кажется, вы создали Composite Primary Key для таблицы tblAircrafts.

Если вы хотите добавить ссылку на составной ключ в таблицу tblflightschedule, вам нужно использовать следующий синтаксис:

alter table tblflightschedule
add foreign key ('int Column', txtAC_tag) references tblaircrafts **(idAC, txtAC_tag);**

И вам нужно передать два столбца для добавления внешнего ключа (‘int Column’, txtAC_tag).

Таким образом, вы можете добавить еще один столбец в таблицу tblflightschedule или удалить один столбец из таблицы tblaircrafts.

Понравилась статья? Поделить с друзьями:
  • Ошибка 182 программа установки amd решение
  • Ошибка 182 программа установки amd как исправить
  • Ошибка 1901 на зале как устранить
  • Ошибка 182 при установке фотошопа
  • Ошибка 1900 форд фокус 2 рестайлинг