thank you for your time.
I am trying to build a database with with the following instructions
T1-Hotel (hotelNo, hotelName, city)
T2-Room (roomNo, hotelNo, type, price)
T3-Guest (guestNo, guestName, guestAddress)
T4-Booking (hotelNo, guestNo, dateFrom, dateTo, roomNo)
I get a Constraint duplication error but I cant tell there is a duplication in the schema.
CREATE TABLE `hotel_booking`.`Booking` (
`hotelNo` VARCHAR(5) NOT NULL,
`guestNo` VARCHAR(5) NOT NULL,
`datefFrom` DATE NOT NULL,
`dateTo` DATE NULL,
`roomNo` VARCHAR(5) NULL,
PRIMARY KEY (`hotelNo`, `guestNo`, `datefFrom`),
INDEX `guestNo_idx` (`guestNo` ASC) VISIBLE,
INDEX `roomNo_idx` (`roomNo` ASC) VISIBLE,
CONSTRAINT `hotelNo`
FOREIGN KEY (`hotelNo`)
REFERENCES `hotel_booking`.`Hotel` (`hotelNo`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `guestNo`
FOREIGN KEY (`guestNo`)
REFERENCES `hotel_booking`.`Guest` (`guestNo`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `roomNo`
FOREIGN KEY (`roomNo`)
REFERENCES `hotel_booking`.`Room` (`roonNo`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
I get the following error ERROR 1826: Duplicate foreign key constraint name ‘hotelNo’
What is wrong and how it can be corrected?
Normally I’d assume this is the fault of Microsoft Access, since Access frequently fails to conform to standard SQL. But this time it’s the fault of MySQL.
This is a bug in MySQL: https://bugs.mysql.com/bug.php?id=72751
Constraint names are supposed to be case-sensitive, per https://dev.mysql.com/doc/refman/8.0/en/identifier-case-sensitivity.html:
Object names may be considered duplicates if their uppercase forms are equal according to a binary collation.
In other words, some object names are case-insensitive.
That is true for names of cursors, conditions, procedures, functions, savepoints, stored routine parameters, stored program local variables, and plugins. It is not true for names of columns, constraints, databases, partitions, statements prepared with PREPARE, tables, triggers, users, and user-defined variables.
That says that constraint names are one of the object types whose names are supposed to case-sensitive.
But that documentation is incorrect. Currently MySQL treats constraint names as case-insensitive. So constraints named idMarca
and IdMarca
conflict.
We can demo this:
mysql> create table parent (id int primary key);
Query OK, 0 rows affected (0.01 sec)
mysql> create table child1 (parent int, constraint con foreign key (parent) references parent(id));
Query OK, 0 rows affected (0.01 sec)
mysql> create table child2 (parent int, constraint Con foreign key (parent) references parent(id));
ERROR 1826 (HY000): Duplicate foreign key constraint name 'Con'
That’s the error message in MySQL 8.0. The names con
and Con
should be treated as distinct, but they aren’t.
In older versions of MySQL, the error message wasn’t clear, something like «1050: Table ‘./test/child2’ already exists».
How to fix this? You’ll have to create your foreign key constraints manually.
This bug was reported in 2014, and hasn’t been fixed, so I wouldn’t get your hopes up that it will be fixed soon. You may click the «Affects Me» button in the bug tracker to vote for it to get some attention, but don’t count on it. Just fix the constraint names in your project.
Operation failed: There was an error while applying the SQL script to the database.
Executing:
ALTER TABLE `xq`.`manageinfo`
ADD CONSTRAINT `idmanagetype`
FOREIGN KEY (`idmanagetype`)
REFERENCES `xq`.`managetype` (`idmanagetype`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
ERROR 1826: Duplicate foreign key constraint name 'idmanagetype'
SQL Statement:
ALTER TABLE `xq`.`manageinfo`
ADD CONSTRAINT `idmanagetype`
FOREIGN KEY (`idmanagetype`)
REFERENCES `xq`.`managetype` (`idmanagetype`)
ON DELETE NO ACTION
ON UPDATE NO ACTION
1826 г. — Нить не отменялась. …Вот этот. .
Причина: я уже добавлял индекс внешнего ключа с именем idmanagetype раньше. Если он будет повторяться, будет сообщено об ошибке. Я добавил 1 после имени и успешно.
ALTER TABLE `xq`.`manageinfo`
ADD INDEX `idmanagetype1_idx` (`idmanagetype` ASC) VISIBLE;
;
ALTER TABLE `xq`.`manageinfo`
ADD CONSTRAINT `idmanagetype1`
FOREIGN KEY (`idmanagetype`)
REFERENCES `xq`.`managetype` (`idmanagetype`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
GNOM003 0 / 0 / 0 Регистрация: 26.12.2019 Сообщений: 11 |
||||
1 |
||||
30.05.2020, 15:01. Показов 12925. Ответов 3 Метки нет (Все метки)
Импортировал модель БД в скрипт и тут такая ошибка: Executing SQL script in server
SQL script execution finished: statements: 10 succeeded, 1 failed Fetching back view definitions in final form.
__________________
0 |
407 / 361 / 141 Регистрация: 09.04.2011 Сообщений: 1,028 |
|
30.05.2020, 16:23 |
2 |
какая у вас версия mysql?
0 |
0 / 0 / 0 Регистрация: 26.12.2019 Сообщений: 11 |
|
30.05.2020, 16:41 [ТС] |
3 |
какая у вас версия mysql? 8.0
0 |
retvizan 407 / 361 / 141 Регистрация: 09.04.2011 Сообщений: 1,028 |
||||||||
30.05.2020, 18:13 |
4 |
|||||||
Решение уберите явное именование ограничения
нужно:
или вместо `aircraft_id` используйте уникальное имя в пределах базы
1 |
Здравствуйте! Я новичок в данной области и нуждаюсь в ответах.
При создании не сложной БД через MySQL Workbench, понадобилось сделать связь трех таблиц, где две из них соединяются по вторичному ключу к третьей таблице. Данные связи я построил в EER Diagram, но вот когда создаю БД через сгенерированный скрипт мне пишет вот такую ошибку: Error Code: 1826. Duplicate foreign key constraint name ‘id_product’ (таблица Booking). Может знаете в чем проблема?
EER модель:
Генерируемый код:
-- MySQL Script generated by MySQL Workbench
-- Tue Sep 15 13:16:18 2020
-- Model: New Model Version: 1.0
-- MySQL Workbench Forward Engineering
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`Product`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Product` (
`id_product` INT NOT NULL,
`category` VARCHAR(45) NOT NULL,
`name` VARCHAR(45) NOT NULL,
`amount` INT NOT NULL,
`price` REAL NOT NULL)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Production`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Production` (
`id_produciton` INT NOT NULL AUTO_INCREMENT,
`id_product` INT NOT NULL,
`amount` INT NOT NULL,
`date` DATE NOT NULL,
PRIMARY KEY (`id_produciton`),
INDEX `id_product_idx` (`id_product` ASC) VISIBLE,
CONSTRAINT `id_product`
FOREIGN KEY (`id_product`)
REFERENCES `mydb`.`Product` (`id_product`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Client`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Client` (
`id_client` INT NOT NULL AUTO_INCREMENT,
`FIO` TEXT(128) NOT NULL,
`organiz_name` TEXT(128) NOT NULL,
`city` TEXT(128) NOT NULL,
`delivery_address` TEXT(128) NOT NULL,
`cont_phone` VARCHAR(45) NOT NULL,
`emale` VARCHAR(45) NOT NULL,
PRIMARY KEY (`id_client`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Booking`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Booking` (
`id_booking` INT NOT NULL AUTO_INCREMENT,
`id_client` INT NOT NULL,
`id_product` INT NOT NULL,
`amount` INT NOT NULL,
`data` DATE NOT NULL,
PRIMARY KEY (`id_booking`),
INDEX `id_product_idx` (`id_product` ASC) VISIBLE,
INDEX `id_client_idx` (`id_client` ASC) VISIBLE,
CONSTRAINT `id_product`
FOREIGN KEY (`id_product`)
REFERENCES `mydb`.`Product` (`id_product`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `id_client`
FOREIGN KEY (`id_client`)
REFERENCES `mydb`.`Client` (`id_client`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Итак, я пытаюсь создать базу данных. У меня есть эта ошибка для дублированного внешнего ключа, и я ничего не могу сказать. Вот моя база данных
СОЗДАТЬ СХЕМУ sjdupl01CECS535Project;
CREATE TABLE `sjdupl01CECS535Project`.`HOTEL` (
`hotelid` INT NOT NULL,
`number` VARCHAR(45) NULL,
`street` VARCHAR(45) NULL,
`city` VARCHAR(45) NULL,
`zip` VARCHAR(45) NULL,
`manager-name` VARCHAR(45) NULL,
`number-rooms` INT UNSIGNED NULL,
`has-pool` TINYINT NULL,
`has-bar` TINYINT NULL,
`has-restaurant` TINYINT NULL,
PRIMARY KEY (`hotelid`));
CREATE TABLE `sjdupl01CECS535Project`.`ROOM` (
`type` ENUM('regular', 'extra', 'suite', 'business', 'luxury', 'family') NOT NULL,
`occupancy` INT NULL,
`number-beds` INT UNSIGNED NULL,
`type-beds` VARCHAR(45) NULL,
`price` INT NULL,
PRIMARY KEY (`type`));
CREATE TABLE `sjdupl01CECS535Project`.`ROOMHOTEL` (
`hotelid` INT NOT NULL,
`room-type` ENUM('regular', 'extra', 'suite', 'business', 'luxury', 'family') NOT NULL,
`number` INT UNSIGNED NULL,
PRIMARY KEY (`hotelid`, `room-type`),
INDEX `room-type_idx` (`room-type` ASC) VISIBLE,
CONSTRAINT `hotelid`
FOREIGN KEY (`hotelid`)
REFERENCES `sjdupl01CECS535Project`.`HOTEL` (`hotelid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `room-type`
FOREIGN KEY (`room-type`)
REFERENCES `sjdupl01CECS535Project`.`ROOM` (`type`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
CREATE TABLE `sjdupl01CECS535Project`.`CUSTOMER` (
`cust-id` INT NOT NULL,
`name` VARCHAR(45) NULL,
`number` VARCHAR(45) NULL,
`street` VARCHAR(45) NULL,
`city` VARCHAR(45) NULL,
`zip` VARCHAR(45) NULL,
`status` ENUM('gold', 'silver', 'business') NULL,
PRIMARY KEY (`cust-id`));
CREATE TABLE `sjdupl01CECS535Project`.`RESERVATION` (
`hotel-id` INT NOT NULL,
`cust-id` INT NOT NULL,
`room-type` ENUM('regular', 'extra', 'suite', 'business', 'luxury', 'family') NOT NULL,
`begin-date` DATE NULL,
`end-date` DATE NULL,
`credit-card-number` VARCHAR(45) NULL,
`exp-date` VARCHAR(45) NULL,
PRIMARY KEY (`hotel-id`, `cust-id`, `room-type`),
INDEX `cust-id_idx` (`cust-id` ASC) VISIBLE,
INDEX `room-type_idx` (`room-type` ASC) VISIBLE,
CONSTRAINT `hotel-id`
FOREIGN KEY (`hotel-id`)
REFERENCES `sjdupl01CECS535Project`.`HOTEL` (`hotelid`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `cust-id`
FOREIGN KEY (`cust-id`)
REFERENCES `sjdupl01CECS535Project`.`CUSTOMER` (`cust-id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `room-type`
FOREIGN KEY (`room-type`)
REFERENCES `sjdupl01CECS535Project`.`ROOM` (`type`)
ON DELETE NO ACTION
ON UPDATE NO ACTION);
ОШИБКА 1826: повторяющееся имя ограничения внешнего ключа ‘room-type’
Таким образом, ошибка возникает на последней таблице (БРОНИРОВАНИЕ).
Я не вижу дублирования типа «номер».
В чем проблема?