Sql error code 1822

Ошибка 1822 MySQL Решение и ответ на вопрос 2816068

max328

0 / 0 / 0

Регистрация: 10.12.2015

Сообщений: 24

1

18.04.2021, 13:00. Показов 2619. Ответов 3

Метки mysql (Все метки)


Здравствуйте. При попытке конвертации кода в MySQL Workbench я получил ошибку 1822. Изменение индекса на одновременно Primary и Unique ничего не дало.

MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Executing SQL script in server
ERROR: Error 1822: Failed to add the foreign key constraint. Missing index for constraint 'FromZtoD' in the referenced table 'dogovor'
SQL Code:
        -- -----------------------------------------------------
        -- Table `mydb`.`Zakaz`
        -- -----------------------------------------------------
        CREATE TABLE IF NOT EXISTS `mydb`.`Zakaz` (
          `id_Zakaz` INT NOT NULL,
          `Tip_zakaza` VARCHAR(255) NOT NULL,
          `Obsh_stoim` VARCHAR(255) NOT NULL,
          PRIMARY KEY (`id_Zakaz`),
          UNIQUE INDEX `id_Zakaz_UNIQUE` (`id_Zakaz` ASC) VISIBLE,
          UNIQUE INDEX `Tip_zakaza_UNIQUE` (`Tip_zakaza` ASC) VISIBLE,
          UNIQUE INDEX `Obsh_stoim_UNIQUE` (`Obsh_stoim` ASC) VISIBLE,
          CONSTRAINT `FromZtoD`
            FOREIGN KEY (`Obsh_stoim`)
            REFERENCES `mydb`.`Dogovor` (`Summa`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION)
        ENGINE = InnoDB
 
SQL script execution finished: statements: 6 succeeded, 1 failed
 
Fetching back view definitions in final form.
Nothing to fetch
Executing SQL script in server
ERROR: Error 1822: Failed to add the foreign key constraint. Missing index for constraint 'FromZtoD' in the referenced table 'dogovor'
SQL Code:
        -- -----------------------------------------------------
        -- Table `mydb`.`Zakaz`
        -- -----------------------------------------------------
        CREATE TABLE IF NOT EXISTS `mydb`.`Zakaz` (
          `id_Zakaz` INT NOT NULL,
          `Tip_zakaza` VARCHAR(255) NOT NULL,
          `Obsh_stoim` VARCHAR(255) NOT NULL,
          PRIMARY KEY (`id_Zakaz`),
          UNIQUE INDEX `id_Zakaz_UNIQUE` (`id_Zakaz` ASC) VISIBLE,
          UNIQUE INDEX `Tip_zakaza_UNIQUE` (`Tip_zakaza` ASC) VISIBLE,
          UNIQUE INDEX `Obsh_stoim_UNIQUE` (`Obsh_stoim` ASC) VISIBLE,
          CONSTRAINT `FromZtoD`
            FOREIGN KEY (`Obsh_stoim`)
            REFERENCES `mydb`.`Dogovor` (`Summa`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION)
        ENGINE = InnoDB
 
SQL script execution finished: statements: 6 succeeded, 1 failed
 
Fetching back view definitions in final form.
Nothing to fetch

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



1444 / 906 / 345

Регистрация: 31.05.2012

Сообщений: 3,183

18.04.2021, 20:54

2

Странный внешний ключ по стоимости. Ну ТС видней, надо так надо )) Тогда в таблице Dogovor поле Summa должно быть ключевым с индексом. Ошибка то об этом орёт



0



0 / 0 / 0

Регистрация: 10.12.2015

Сообщений: 24

19.04.2021, 11:19

 [ТС]

3

Здравствуйте. Ваш совет к сожалению не помог. Извините, я полный нуб в SQL.

Миниатюры

Ошибка 1822
 



0



Аватар

1444 / 906 / 345

Регистрация: 31.05.2012

Сообщений: 3,183

19.04.2021, 11:55

4

Да не было ни какого совета, не может быть стоимость внешним ключом. Добавить в заказ поле Id_Dogovor и сделать его внешним ключом:

MySQL
1
CONSTRAINT `FromZtoD` FOREIGN KEY (`Id_Dogovor`) REFERENCES `mydb`.`Dogovor` (`Id_Dogovor`) ...

Да и стоимостные поля в строковом виде во всех таблицах источник проблем в дальнейшем



0



mysql, error reported: 1822-failed to add the foreign key constraint. Missing index for constraint ‘tb_emp_ibfk_1’ in the referenced table ‘tb_dept’

reason: if table A has no primary key set, the fields in table A cannot be used as foreign keys for table B.

solution, on the premise of not deleting table A, add the following SQL text:

ALTER TABLE tb_dept ADD PRIMARY KEY(deptno);

SQL:

DROP DATABASE IF EXISTS tb_test;
CREATE DATABASE tb_test DEFAULT charset utf8;

USE tb_test;
# 部门表
CREATE TABLE tb_dept ( 
	deptno INT NOT NULL COMMENT '编号', 
	deptname VARCHAR ( 10 ) NOT NULL COMMENT '名称', 
	deptaddr VARCHAR ( 20 ) NOT NULL COMMENT '地址' 
);
INSERT INTO tb_dept VALUES
	( 101, '研发部门', '武汉' ),
	( 127, '会计部门', '上海' );
# 员工表
DROP TABLE IF EXISTS tb_emp;
CREATE TABLE tb_emp (
	empno INT NOT NULL COMMENT '编号',
	empname VARCHAR ( 10 ) NOT NULL COMMENT '姓名',
	empjob VARCHAR ( 10 ) NOT NULL COMMENT '职位',
	empsal INT NOT NULL DEFAULT 3000 COMMENT '薪酬',
	deptno INT NOT NULL COMMENT '所属部门',
	PRIMARY KEY ( empno ),
	FOREIGN KEY ( deptno ) REFERENCES tb_dept ( deptno )
);
INSERT INTO tb_emp VALUES
	(10001,'杨过','研发主管',2000000,101),
	(40001,'张三丰','总裁',90000000,127);

operation result:

DROP DATABASE IF EXISTS tb_test
> OK
> 时间: 0.32s


CREATE DATABASE tb_test DEFAULT charset utf8
> OK
> 时间: 0.991s


USE tb_test
> OK
> 时间: 0.008s


# 部门表
CREATE TABLE tb_dept ( 
	deptno INT NOT NULL COMMENT '编号', 
	deptname VARCHAR ( 10 ) NOT NULL COMMENT '名称', 
	deptaddr VARCHAR ( 20 ) NOT NULL COMMENT '地址' 
)
> OK
> 时间: 1.74s


INSERT INTO tb_dept VALUES
	( 101, '研发部门', '武汉' ),
	( 127, '会计部门', '上海' )
> Affected rows: 2
> 时间: 0.532s


# 员工表
DROP TABLE IF EXISTS tb_emp
> OK
> 时间: 0.393s


CREATE TABLE tb_emp (
	empno INT NOT NULL COMMENT '编号',
	empname VARCHAR ( 10 ) NOT NULL COMMENT '姓名',
	empjob VARCHAR ( 10 ) NOT NULL COMMENT '职位',
	empsal INT NOT NULL DEFAULT 3000 COMMENT '薪酬',
	deptno INT NOT NULL COMMENT '所属部门',
	PRIMARY KEY ( empno ),
	FOREIGN KEY ( deptno ) REFERENCES tb_dept ( deptno )
)
> 1822 - Failed to add the foreign key constraint. Missing index for constraint 'tb_emp_ibfk_1' in the referenced table 'tb_dept'
> 时间: 0.034s

Read More:

Я пытаюсь создать таблицу с составным внешним ключом, но постоянно получаю ошибку 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';

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

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.

Вопрос:

Я пытаюсь добавить внешний ключ к моей таблице расписания полетов, но он терпит неудачу, но я действительно не знаю, почему. Внешний ключ должен ссылаться на атрибут 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.

Понравилась статья? Поделить с друзьями:
  • Sql error code 1205
  • Sql error code 1055
  • Sql error code 104 token unknown
  • Sql error code 0x84b30002
  • Sql error 42p01 error relation does not exist