max328 0 / 0 / 0 Регистрация: 10.12.2015 Сообщений: 24 |
||||
1 |
||||
18.04.2021, 13:00. Показов 2619. Ответов 3 Метки mysql (Все метки)
Здравствуйте. При попытке конвертации кода в MySQL Workbench я получил ошибку 1822. Изменение индекса на одновременно Primary и Unique ничего не дало.
__________________
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. Миниатюры
0 |
Аватар 1444 / 906 / 345 Регистрация: 31.05.2012 Сообщений: 3,183 |
||||
19.04.2021, 11:55 |
4 |
|||
Да не было ни какого совета, не может быть стоимость внешним ключом. Добавить в заказ поле 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.