MySQL innodb - Foreign Key: only 1st works? - mysql

I have this example bellow where customers_b cannot be created.
Error Code 1005 / errno: 121.
However, if I create customers_b first than customers_a, then customers_a is the one which won't be created.
What is wrong? Why I cant link more than one FK to the PK 'id_state'?
Thanks!
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='TRADITIONAL,ALLOW_INVALID_DATES';
DROP SCHEMA IF EXISTS `testdb` ;
CREATE SCHEMA IF NOT EXISTS `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `testdb` ;
-- -----------------------------------------------------
-- Table `testdb`.`state`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `testdb`.`state` ;
CREATE TABLE IF NOT EXISTS `testdb`.`state` (
`id_state` INT NOT NULL,
`abbr` CHAR(2) NOT NULL,
PRIMARY KEY (`id_state`),
UNIQUE INDEX `id_state_UNIQUE` (`id_state` ASC))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `testdb`.`customers_a`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `testdb`.`customers_a` ;
CREATE TABLE IF NOT EXISTS `testdb`.`customers_a` (
`id_customer` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
`addr_state` INT NOT NULL,
PRIMARY KEY (`id_customer`),
CONSTRAINT `fk_state`
FOREIGN KEY (`addr_state`)
REFERENCES `testdb`.`state` (`id_state`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `testdb`.`customers_b`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `testdb`.`customers_b` ;
CREATE TABLE IF NOT EXISTS `testdb`.`customers_b` (
`id_customer` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
`addr_state` INT NOT NULL,
PRIMARY KEY (`id_customer`),
CONSTRAINT `fk_state`
FOREIGN KEY (`addr_state`)
REFERENCES `testdb`.`state` (`id_state`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

You can't use the same name fk_state for both constraints. Give one of them a different name.
CREATE TABLE IF NOT EXISTS `customers_b` (
`id_customer` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
`addr_state` INT NOT NULL,
PRIMARY KEY (`id_customer`),
CONSTRAINT `fk_state_b`
FOREIGN KEY (`addr_state`)
REFERENCES `state` (`id_state`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

Your both tables constraint name is same CONSTRAINT fk_state. for customer_b change that name like below
CREATE TABLE IF NOT EXISTS `customers_a` (
`id_customer` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
`addr_state` INT NOT NULL,
PRIMARY KEY (`id_customer`),
CONSTRAINT `fk_state`
FOREIGN KEY (`addr_state`)
REFERENCES `state` (`id_state`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `customers_b` (
`id_customer` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
`addr_state` INT NOT NULL,
PRIMARY KEY (`id_customer`),
CONSTRAINT `fk_state1` <-- Here
FOREIGN KEY (`addr_state`)
REFERENCES `state` (`id_state`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

Related

Failed to add the foreign key constraint. Missing column 'gym_id' for constraint 'fk_gyms_instructors_gyms' in the referenced table 'gyms'

I'm forward engineering a database from an ERD that I created in MySqlWorkbench. I have a very basic many to many relationship between the "gyms" table and the "instructors" table, but I'm getting the error above. To me, the error reads that MySql can't find the "gym_id" column in the "gyms" table when it tries to create the many-to-many table.
I don't know why that would be the case.
I've went through the tables to make sure there were no typos and that the data types matched. I also went through the execution script to make sure the "gyms" table was being created before the many-to-many. It was. I can't sniff out what is causing the error. So any help or suggestion is appreciated
This is the error:
Executing SQL script in server
ERROR: Error 3734: Failed to add the foreign key constraint. Missing column 'gym_id' for constraint 'fk_gyms_instructors_gyms' in the referenced table 'gyms'
SQL Code:
-- -----------------------------------------------------
-- Table `fitness`.`gyms_instructors`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`gyms_instructors` (
`id` INT NOT NULL AUTO_INCREMENT,
`gym_id` SMALLINT NOT NULL,
`instructor_id` SMALLINT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_gyms_instructors_gyms_idx` (`gym_id` ASC) VISIBLE,
INDEX `fk_gyms_instructors_instructors_idx` (`instructor_id` ASC) VISIBLE,
CONSTRAINT `fk_gyms_instructors_gyms`
FOREIGN KEY (`gym_id`)
REFERENCES `fitness`.`gyms` (`gym_id`)
ON DELETE NO ACTION
ON UPDATE CASCADE,
CONSTRAINT `fk_gyms_instructors_instructors`
FOREIGN KEY (`instructor_id`)
REFERENCES `fitness`.`instructors` (`instructor_id`)
ON DELETE NO ACTION
ON UPDATE CASCADE)
ENGINE = InnoDB
SQL script execution finished: statements: 10 succeeded, 1 failed
Fetching back view definitions in final form.
Nothing to fetch
The other potentially useful information is:
1. On the many to many table, in the foreign keys section both gym_id and instructor_id are SMALLINTS and NOT NULL,
2. On their respective table the gym_id and instructor_id are autoincrementing primary keys, NOT NULL
3. I pasted the full script below if you want to look.
-- 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 fitness
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema fitness
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `fitness` DEFAULT CHARACTER SET utf8 ;
USE `fitness` ;
-- -----------------------------------------------------
-- Table `fitness`.`fitness_classes`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`fitness_classes` (
`fitness_class_id` INT NOT NULL AUTO_INCREMENT,
`title` VARCHAR(45) NOT NULL,
`price` DECIMAL(2,2) NOT NULL,
`description` VARCHAR(500) NOT NULL,
`vacancies` INT NOT NULL,
`start_time` DATETIME NOT NULL,
PRIMARY KEY (`fitness_class_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `fitness`.`categories`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`categories` (
`category_id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NOT NULL,
`description` TEXT(1200) NULL,
PRIMARY KEY (`category_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `fitness`.`tags`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`tags` (
`id` INT NOT NULL AUTO_INCREMENT,
`fitness_class_id` INT NOT NULL,
`category_id` INT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_tags_fitness_classes_idx` (`fitness_class_id` ASC) VISIBLE,
INDEX `fk_tags_categories_idx` (`category_id` ASC) VISIBLE,
CONSTRAINT `fk_tags_fitness_classes`
FOREIGN KEY (`fitness_class_id`)
REFERENCES `fitness`.`fitness_classes` (`fitness_class_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_tags_categories`
FOREIGN KEY (`category_id`)
REFERENCES `fitness`.`categories` (`category_id`)
ON DELETE NO ACTION
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `fitness`.`gyms`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`gyms` (
`gym_id` SMALLINT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(55) NOT NULL,
`address` VARCHAR(55) NOT NULL,
`city` VARCHAR(25) NOT NULL,
`state` VARCHAR(25) NOT NULL,
`phone` VARCHAR(10) NOT NULL,
`latitude` DECIMAL(10,8) NULL,
`longitude` DECIMAL(10,8) NULL,
`neighborhood` VARCHAR(45) NOT NULL,
`create_time` TIMESTAMP NOT NULL,
PRIMARY KEY (`gym_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `fitness`.`instructors`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`instructors` (
`instructor_id` SMALLINT NOT NULL AUTO_INCREMENT,
`first_name` VARCHAR(55) NOT NULL,
`last_name` VARCHAR(55) NOT NULL,
`create_time` TIMESTAMP NOT NULL,
PRIMARY KEY (`instructor_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `fitness`.`gyms_instructors`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`gyms_instructors` (
`id` INT NOT NULL AUTO_INCREMENT,
`gym_id` SMALLINT NOT NULL,
`instructor_id` SMALLINT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_gyms_instructors_gyms_idx` (`gym_id` ASC) VISIBLE,
INDEX `fk_gyms_instructors_instructors_idx` (`instructor_id` ASC) VISIBLE,
CONSTRAINT `fk_gyms_instructors_gyms`
FOREIGN KEY (`gym_id`)
REFERENCES `fitness`.`gyms` (`gym_id`)
ON DELETE NO ACTION
ON UPDATE CASCADE,
CONSTRAINT `fk_gyms_instructors_instructors`
FOREIGN KEY (`instructor_id`)
REFERENCES `fitness`.`instructors` (`instructor_id`)
ON DELETE NO ACTION
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `fitness`.`listings`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`listings` (
`id` INT NOT NULL AUTO_INCREMENT,
`gym_id` SMALLINT NOT NULL,
`fitness_class_id` INT NOT NULL,
`instructor_id` SMALLINT NOT NULL,
PRIMARY KEY (`id`),
INDEX `fk_listings_gym_idx` (`gym_id` ASC) VISIBLE,
INDEX `fk_listings_fitness_class_idx` (`fitness_class_id` ASC) VISIBLE,
INDEX `fk_listings_instructor_idx` (`instructor_id` ASC) VISIBLE,
CONSTRAINT `fk_listings_gym`
FOREIGN KEY (`gym_id`)
REFERENCES `fitness`.`gyms` (`gym_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_listings_fitness_class`
FOREIGN KEY (`fitness_class_id`)
REFERENCES `fitness`.`fitness_classes` (`fitness_class_id`)
ON DELETE NO ACTION
ON UPDATE CASCADE,
CONSTRAINT `fk_listings_instructor`
FOREIGN KEY (`instructor_id`)
REFERENCES `fitness`.`instructors` (`instructor_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `fitness`.`users`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`users` (
`user_id` INT NOT NULL AUTO_INCREMENT,
`email` VARCHAR(255) NOT NULL,
`password` VARCHAR(32) NOT NULL,
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`username` VARCHAR(16) NOT NULL,
PRIMARY KEY (`user_id`));
-- -----------------------------------------------------
-- Table `fitness`.`reviews`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`reviews` (
`review_id` INT NOT NULL AUTO_INCREMENT,
`fitness_class_id` INT NOT NULL,
`rating` TINYINT(1) NOT NULL,
`review_text` TEXT(1200) NULL,
`create_time` TIMESTAMP NOT NULL,
PRIMARY KEY (`review_id`),
INDEX `fk_reviews_classes_idx` (`fitness_class_id` ASC) VISIBLE,
CONSTRAINT `fk_reviews_classes`
FOREIGN KEY (`fitness_class_id`)
REFERENCES `fitness`.`fitness_classes` (`fitness_class_id`)
ON DELETE NO ACTION
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `fitness`.`bookings`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `fitness`.`bookings` (
`booking_id` INT NOT NULL AUTO_INCREMENT,
`fitness_class_id` INT NOT NULL,
`user_id` INT NOT NULL,
`price` DECIMAL(2,2) NOT NULL,
`class_start_time` DATETIME NOT NULL,
`purchase_date` DATETIME NOT NULL,
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`booking_id`),
CONSTRAINT `user_id`
FOREIGN KEY ()
REFERENCES `fitness`.`users` ()
ON DELETE NO ACTION
ON UPDATE CASCADE,
CONSTRAINT `fitness_class_id`
FOREIGN KEY ()
REFERENCES `fitness`.`fitness_classes` ()
ON DELETE NO ACTION
ON UPDATE CASCADE)
ENGINE = InnoDB;
SET SQL_MODE=#OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=#OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=#OLD_UNIQUE_CHECKS;

MySQL Workbench "errno 150 foreign key"

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='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`Diploma`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Diploma` (
`diploma_id` VARCHAR(5) NOT NULL,
`diploma_name` VARCHAR(90) NULL,
PRIMARY KEY (`diploma_id`)
) ENGINE=InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`School`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`School` (
`school_id` INT(1) NOT NULL,
`school_name` VARCHAR(45) NULL,
PRIMARY KEY (`school_id`)
) ENGINE=InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Student`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Student` (
`student_number` INT(8) NOT NULL,
`student_id` INT(8) NULL,
`student_name` VARCHAR(45) NULL,
`student_password` VARCHAR(45) NULL,
`student_mobile` INT(8) NULL,
`student_email` VARCHAR(45) NULL,
`diploma_id` VARCHAR(5) NOT NULL,
`school_id` INT(1) NOT NULL,
PRIMARY KEY (`student_number`),
INDEX `fk_Student_Diploma1_idx` (`diploma_id` ASC),
INDEX `fk_Student_School1_idx` (`school_id` ASC),
CONSTRAINT `fk_Student_Diploma1` FOREIGN KEY (`diploma_id`)
REFERENCES `mydb`.`Diploma` (`diploma_id`)
ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_Student_School1` FOREIGN KEY (`school_id`)
REFERENCES `mydb`.`School` (`school_id`)
ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`OFN`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`OFN` (
`ofn_id` INT(8) NOT NULL,
`ofn_username` VARCHAR(45) NULL,
`ofn_password` VARCHAR(45) NULL,
`ofn_email` VARCHAR(45) NULL,
PRIMARY KEY (`ofn_id`)
) ENGINE=InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Appointment`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Appointment` (
`appointment_id` INT(8) NOT NULL,
`appointment_date` DATE NULL,
`appointment_time` TIME NULL,
`ofn_id` INT(8) NOT NULL,
PRIMARY KEY (`appointment_id`),
INDEX `fk_Appointment_OFN1_idx` (`ofn_id` ASC),
CONSTRAINT `fk_Appointment_OFN1` FOREIGN KEY (`ofn_id`)
REFERENCES `mydb`.`OFN` (`ofn_id`)
ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Booking`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `mydb`.`Booking` (
`student_number` INT(8) NOT NULL,
`appointment_id` INT(8) NOT NULL,
`booking_date` DATE NULL,
`booking_time` TIME NULL,
PRIMARY KEY (`student_number` , `appointment_id`),
INDEX `fk_Student_has_Appointment_Appointment1_idx` (`appointment_id` ASC),
INDEX `fk_Student_has_Appointment_Student1_idx` (`student_number` ASC),
CONSTRAINT `fk_Student_has_Appointment_Student1` FOREIGN KEY
(`student_number`)
REFERENCES `mydb`.`Student` (`student_number`)
ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_Student_has_Appointment_Appointment1` FOREIGN KEY (`appointment_id`)
REFERENCES `mydb`.`Appointment` (`appointment_id`)
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;
This is the code i was building but it gave an error
Error Code: 1005: Can't create table 'mydb'.'booking'
I tried looking through some of the previous question by people encountering the same problem but i am still stuck at this point.
Any help will be greatly appreciated, thank you.
Somehow it's the foreign key student_number.
I am thinking in these possibilities:
The foreign key name is a duplicate of an already existing key. Check that the name of your foreign key is unique within your database. Just add a few random characters to the end of your key name to test for this.
One or both of your tables is a MyISAM table. In order to use foreign keys, the tables must both be InnoDB. (Actually, if both tables are MyISAM then you won’t get an error message - it just won’t create the key.) In Query Browser, you can specify the table type.
One of the key field that you are trying to reference does not have an index and/or is not a primary key. If one of the fields in the relationship is not a primary key, you must create an index for that field.
Also check:
SET FOREIGN_KEY_CHECKS=0;

MySQL error: Duplicate key on write or update

I have been using MySQL to design a database, when compiled into SQL code and executed it produces two errors. One that states Variable 'unique checks' can't be set to the value of 'NULL' and another that produces message "Duplicate key on write and update" I have a feeling that it is my foreign keys that are causing this issue but still cannot fix the problem. I have attached the query code below.
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='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
DROP SCHEMA IF EXISTS `mydb` ;
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`User`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`User` ;
CREATE TABLE IF NOT EXISTS `mydb`.`User` (
`idUser` INT NOT NULL,
`first_name` VARCHAR(45) NULL,
`last_name` VARCHAR(45) NULL,
`username` VARCHAR(45) NULL,
`password` VARCHAR(45) NULL,
`company_pin` VARCHAR(45) NULL,
`student_pin` VARCHAR(45) NULL,
`isAdmin` TINYINT(1) NULL DEFAULT 0,
`isCandidate` TINYINT(1) NULL,
`isVoter` TINYINT(1) NULL,
`votes_left` INT NULL,
`votes_achieved` INT NULL,
PRIMARY KEY (`idUser`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Issue`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Issue` ;
CREATE TABLE IF NOT EXISTS `mydb`.`Issue` (
`idIssue` INT NOT NULL,
`issueTitle` VARCHAR(45) NULL,
`issueDescription` VARCHAR(255) NULL,
`userID` INT NULL,
`isResolved` TINYINT(1) NULL DEFAULT 0,
`upVotes` INT NULL,
PRIMARY KEY (`idIssue`),
INDEX `FK_USERID_idx` (`userID` ASC),
CONSTRAINT `FK_USERID`
FOREIGN KEY (`userID`)
REFERENCES `mydb`.`User` (`idUser`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Forum`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Forum` ;
CREATE TABLE IF NOT EXISTS `mydb`.`Forum` (
`idForum` INT NOT NULL,
`userID` INT NULL,
`postTitle` VARCHAR(45) NULL,
`postText` VARCHAR(255) NULL,
`upVotes` INT NULL,
PRIMARY KEY (`idForum`),
INDEX `FK_USERID_idx` (`userID` ASC),
CONSTRAINT `FK_USERID`
FOREIGN KEY (`userID`)
REFERENCES `mydb`.`User` (`idUser`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Vote`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Vote` ;
CREATE TABLE IF NOT EXISTS `mydb`.`Vote` (
`idVote` INT NOT NULL,
`voteFor` ENUM('TOPIC', 'USER', 'ISSUE') NULL,
`topicID` INT NULL,
`userID` INT NULL,
`issueID` INT NULL,
PRIMARY KEY (`idVote`),
INDEX `FK_USER_VOTED_FOR_idx` (`userID` ASC),
INDEX `FK_ISSUE_VOTED_FOR_idx` (`issueID` ASC),
INDEX `FK_FORUM_VOTED_FOR_idx` (`topicID` ASC),
CONSTRAINT `FK_USER_VOTED_FOR`
FOREIGN KEY (`userID`)
REFERENCES `mydb`.`User` (`idUser`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_ISSUE_VOTED_FOR`
FOREIGN KEY (`issueID`)
REFERENCES `mydb`.`Issue` (`idIssue`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_FORUM_VOTED_FOR`
FOREIGN KEY (`topicID`)
REFERENCES `mydb`.`Forum` (`idForum`)
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;
You already have a Constraint with the name FK_USERID on table mydb.issue. Give the constraint on mydb.Forum another name. e.g.
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='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
DROP SCHEMA IF EXISTS `mydb` ;
-- -----------------------------------------------------
-- Schema mydb
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 ;
USE `mydb` ;
-- -----------------------------------------------------
-- Table `mydb`.`User`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`User` ;
CREATE TABLE IF NOT EXISTS `mydb`.`User` (
`idUser` INT NOT NULL,
`first_name` VARCHAR(45) NULL,
`last_name` VARCHAR(45) NULL,
`username` VARCHAR(45) NULL,
`password` VARCHAR(45) NULL,
`company_pin` VARCHAR(45) NULL,
`student_pin` VARCHAR(45) NULL,
`isAdmin` TINYINT(1) NULL DEFAULT 0,
`isCandidate` TINYINT(1) NULL,
`isVoter` TINYINT(1) NULL,
`votes_left` INT NULL,
`votes_achieved` INT NULL,
PRIMARY KEY (`idUser`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Issue`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Issue` ;
CREATE TABLE IF NOT EXISTS `mydb`.`Issue` (
`idIssue` INT NOT NULL,
`issueTitle` VARCHAR(45) NULL,
`issueDescription` VARCHAR(255) NULL,
`userID` INT NULL,
`isResolved` TINYINT(1) NULL DEFAULT 0,
`upVotes` INT NULL,
PRIMARY KEY (`idIssue`),
INDEX `FK_USERID_idx` (`userID` ASC),
CONSTRAINT `FK_USERID`
FOREIGN KEY (`userID`)
REFERENCES `mydb`.`User` (`idUser`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Forum`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Forum` ;
CREATE TABLE IF NOT EXISTS `mydb`.`Forum` (
`idForum` INT NOT NULL,
`userID` INT NULL,
`postTitle` VARCHAR(45) NULL,
`postText` VARCHAR(255) NULL,
`upVotes` INT NULL,
PRIMARY KEY (`idForum`),
INDEX `FK_USERID_idx` (`userID` ASC),
CONSTRAINT `FK_Forum_USERID`
FOREIGN KEY (`userID`)
REFERENCES `mydb`.`User` (`idUser`)
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `mydb`.`Vote`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `mydb`.`Vote` ;
CREATE TABLE IF NOT EXISTS `mydb`.`Vote` (
`idVote` INT NOT NULL,
`voteFor` ENUM('TOPIC', 'USER', 'ISSUE') NULL,
`topicID` INT NULL,
`userID` INT NULL,
`issueID` INT NULL,
PRIMARY KEY (`idVote`),
INDEX `FK_USER_VOTED_FOR_idx` (`userID` ASC),
INDEX `FK_ISSUE_VOTED_FOR_idx` (`issueID` ASC),
INDEX `FK_FORUM_VOTED_FOR_idx` (`topicID` ASC),
CONSTRAINT `FK_USER_VOTED_FOR`
FOREIGN KEY (`userID`)
REFERENCES `mydb`.`User` (`idUser`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_ISSUE_VOTED_FOR`
FOREIGN KEY (`issueID`)
REFERENCES `mydb`.`Issue` (`idIssue`)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_FORUM_VOTED_FOR`
FOREIGN KEY (`topicID`)
REFERENCES `mydb`.`Forum` (`idForum`)
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;
I got this error at a time of restoring of database & I found below details :
This issue comes into picture when your table/database names are not same like small/capital letters used in same table/database name on both side (needs to maintain same name on both side as it's case_sensitive).

Create table failed in MySQL

I have designed the schema and generated the create SQL below using the MySQLWorkbench.
This query through this error: Can't create table 'museum.statue_details'. Could someone please tell me what seems to be the problem and how to solve it? Thanks.
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='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `museum` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `museum` ;
-- -----------------------------------------------------
-- Table `museum`.`collection`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`collection` ;
CREATE TABLE IF NOT EXISTS `museum`.`collection` (
`collection_id` INT NOT NULL,
`name` VARCHAR(45) NULL,
`type` VARCHAR(45) NULL,
`description` VARCHAR(45) NULL,
`address` VARCHAR(45) NULL,
`phone` VARCHAR(45) NULL,
`current_contact_person` VARCHAR(45) NULL,
PRIMARY KEY (`collection_id`),
UNIQUE INDEX `name_UNIQUE` (`name` ASC))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`country`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`country` ;
CREATE TABLE IF NOT EXISTS `museum`.`country` (
`country_id` INT NOT NULL,
`country_name` VARCHAR(45) NULL,
PRIMARY KEY (`country_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`epoch`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`epoch` ;
CREATE TABLE IF NOT EXISTS `museum`.`epoch` (
`epoch_id` INT NOT NULL,
`epoch_name` VARCHAR(45) NULL,
PRIMARY KEY (`epoch_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`artefact`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`artefact` ;
CREATE TABLE IF NOT EXISTS `museum`.`artefact` (
`artefact_id` INT NOT NULL,
`collection_id` INT NOT NULL,
`country_id` INT NOT NULL,
`epoch_id` INT NOT NULL,
`title` VARCHAR(50) NULL,
`description` TEXT NULL,
`year` DATE NULL,
PRIMARY KEY (`artefact_id`, `collection_id`, `country_id`, `epoch_id`),
INDEX `collection_id_idx` (`collection_id` ASC),
INDEX `country_id_idx` (`country_id` ASC),
INDEX `epoch_id_idx` (`epoch_id` ASC),
CONSTRAINT `collection_id`
FOREIGN KEY (`collection_id`)
REFERENCES `museum`.`collection` (`collection_id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION,
CONSTRAINT `country_id`
FOREIGN KEY (`country_id`)
REFERENCES `museum`.`country` (`country_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT,
CONSTRAINT `epoch_id`
FOREIGN KEY (`epoch_id`)
REFERENCES `museum`.`epoch` (`epoch_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`painting_details`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`painting_details` ;
CREATE TABLE IF NOT EXISTS `museum`.`painting_details` (
`artefact_id` INT NOT NULL,
`type` VARCHAR(45) NULL,
`material` VARCHAR(45) NULL,
`style` VARCHAR(45) NULL,
PRIMARY KEY (`artefact_id`),
CONSTRAINT `artefact_id`
FOREIGN KEY (`artefact_id`)
REFERENCES `museum`.`artefact` (`artefact_id`)
ON DELETE RESTRICT
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`statue_details`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`statue_details` ;
CREATE TABLE IF NOT EXISTS `museum`.`statue_details` (
`artefact_id` INT NOT NULL,
`material` VARCHAR(45) NULL,
`height` DECIMAL(10,2) NULL,
`weight` DECIMAL(10,2) NULL,
`style` VARCHAR(45) NULL,
PRIMARY KEY (`artefact_id`),
CONSTRAINT `artefact_id`
FOREIGN KEY (`artefact_id`)
REFERENCES `museum`.`artefact` (`artefact_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`relic_details`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`relic_details` ;
CREATE TABLE IF NOT EXISTS `museum`.`relic_details` (
`artefact_id` INT NOT NULL,
`material` VARCHAR(45) NULL,
`usage` VARCHAR(45) NULL,
PRIMARY KEY (`artefact_id`),
CONSTRAINT `artefact_id`
FOREIGN KEY (`artefact_id`)
REFERENCES `museum`.`artefact` (`artefact_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`owner`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`owner` ;
CREATE TABLE IF NOT EXISTS `museum`.`owner` (
`owner_id` INT NOT NULL,
`owner_name` VARCHAR(45) NULL,
PRIMARY KEY (`owner_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`other_artefact`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`other_artefact` ;
CREATE TABLE IF NOT EXISTS `museum`.`other_artefact` (
`artefact_id` INT NOT NULL,
`name` VARCHAR(45) NULL,
`description` TEXT NULL,
PRIMARY KEY (`artefact_id`),
CONSTRAINT `artifact_id`
FOREIGN KEY (`artefact_id`)
REFERENCES `museum`.`artefact` (`artefact_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`borrowed_artefact`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`borrowed_artefact` ;
CREATE TABLE IF NOT EXISTS `museum`.`borrowed_artefact` (
`artefact_id` INT NOT NULL,
`owner_id` INT NULL,
`collection_id` INT NOT NULL,
`date_borrowed` DATE NULL,
`date_returned` DATE NULL,
INDEX `owner_id_idx` (`owner_id` ASC),
INDEX `artifact_id_idx` (`artefact_id` ASC),
INDEX `collection_id_idx` (`collection_id` ASC),
CONSTRAINT `artefact_id`
FOREIGN KEY (`artefact_id`)
REFERENCES `museum`.`artefact` (`artefact_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT,
CONSTRAINT `owner_id`
FOREIGN KEY (`owner_id`)
REFERENCES `museum`.`owner` (`owner_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT,
CONSTRAINT `collection_id`
FOREIGN KEY (`collection_id`)
REFERENCES `museum`.`collection` (`collection_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`permenent_artefact`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`permenent_artefact` ;
CREATE TABLE IF NOT EXISTS `museum`.`permenent_artefact` (
`artefact_id` INT NOT NULL,
`cost` DECIMAL(10,2) NULL,
`status` VARCHAR(45) NULL,
`date_acquired` DATE NULL,
PRIMARY KEY (`artefact_id`),
CONSTRAINT `artefact_id`
FOREIGN KEY (`artefact_id`)
REFERENCES `museum`.`artefact` (`artefact_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`creator`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`creator` ;
CREATE TABLE IF NOT EXISTS `museum`.`creator` (
`creator_id` INT NOT NULL,
`country_id` INT NULL COMMENT 'Country of origin',
`epoch_id` INT NULL,
`creator_name` VARCHAR(45) NULL COMMENT 'The creator name is unique',
`creator_dob` DATE NULL COMMENT 'Date of birth',
`creator_dod` DATE NULL COMMENT 'Date of died',
`main_style` VARCHAR(45) NULL,
`description` TEXT NULL,
PRIMARY KEY (`creator_id`),
UNIQUE INDEX `creator_name_UNIQUE` (`creator_name` ASC),
CONSTRAINT `country_id`
FOREIGN KEY (`creator_id`)
REFERENCES `museum`.`country` (`country_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT,
CONSTRAINT `epoch_id`
FOREIGN KEY ()
REFERENCES `museum`.`epoch` ()
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`created_artefact`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`created_artefact` ;
CREATE TABLE IF NOT EXISTS `museum`.`created_artefact` (
`artefact_id` INT NOT NULL,
`creator_id` INT NULL,
INDEX `creator_id_idx` (`creator_id` ASC),
CONSTRAINT `artefact_id`
FOREIGN KEY (`artefact_id`)
REFERENCES `museum`.`artefact` (`artefact_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT,
CONSTRAINT `creator_id`
FOREIGN KEY (`creator_id`)
REFERENCES `museum`.`creator` (`creator_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`exhibition`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`exhibition` ;
CREATE TABLE IF NOT EXISTS `museum`.`exhibition` (
`exhibition_id` INT NOT NULL,
`country_id` VARCHAR(45) NULL,
`start_date` DATE NOT NULL,
`end_date` DATE NOT NULL,
PRIMARY KEY (`exhibition_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `museum`.`artifact_displayed_during_exhibition`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `museum`.`artifact_displayed_during_exhibition` ;
CREATE TABLE IF NOT EXISTS `museum`.`artifact_displayed_during_exhibition` (
`exhibition_id` INT NOT NULL,
`artefact_id` INT NULL,
PRIMARY KEY (`exhibition_id`),
INDEX `artifact_id_idx` (`artefact_id` ASC),
CONSTRAINT `exhibition_id`
FOREIGN KEY (`exhibition_id`)
REFERENCES `museum`.`exhibition` (`exhibition_id`)
ON DELETE RESTRICT
ON UPDATE RESTRICT,
CONSTRAINT `artefact_id`
FOREIGN KEY (`artefact_id`)
REFERENCES `museum`.`artefact` (`artefact_id`)
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;
You have many constraints with the same name,change them or let mysql name them.
CONSTRAINT `artefact_id`
this repeats everywhere.There are others.
Also in museum.creator you have missing columns:
CONSTRAINT `epoch_id`
FOREIGN KEY ()
REFERENCES `museum`.`epoch` ()
You probably want epoch_id in between.All those fixed, it runs on my machine.
you should give other name of your foreign keys like that:
insetead of
CONSTRAINT `artefact_id`
FOREIGN KEY (`artefact_id`)
REFERENCES `museum`.`artefact` (`artefact_id`)
do:
CONSTRAINT FK_mykey --> give name as you like here to distinguich between others
FOREIGN KEY (`artefact_id`)
REFERENCES `artefact` (`artefact_id`)
create table syntax:
http://dev.mysql.com/doc/refman/5.7/en/create-table.html
I believe the issue lies with you declaring the table name with {name1}.{name2}.
CREATE TABLE IF NOT EXISTS `collection` (
`collection_id` INT NOT NULL,
`name` VARCHAR(45) NULL,
`type` VARCHAR(45) NULL,
`description` VARCHAR(45) NULL,
`address` VARCHAR(45) NULL,
`phone` VARCHAR(45) NULL,
`current_contact_person` VARCHAR(45) NULL,
PRIMARY KEY (`collection_id`),
UNIQUE INDEX `name_UNIQUE` (`name` ASC))
ENGINE = InnoDB;
`
worked for me

#1005 - Can't create table 'feedback.answer' (errno: 150)

I am getting an error with mysql and I do not understand why:
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='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `feedback` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `feedback` ;
-- -----------------------------------------------------
-- Table `feedback`.`application`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feedback`.`application` (
`application_id` INT NOT NULL AUTO_INCREMENT,
`app_name` VARCHAR(45) NULL,
PRIMARY KEY (`application_id`),
UNIQUE INDEX `app_name_UNIQUE` (`app_name` ASC))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `feedback`.`user`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feedback`.`user` (
`user_id` INT NOT NULL AUTO_INCREMENT,
`firstname` VARCHAR(45) NOT NULL,
`lastname` VARCHAR(45) NULL,
`email` VARCHAR(45) NOT NULL,
`customer_length` VARCHAR(45) NULL,
PRIMARY KEY (`user_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `feedback`.`users_has_application`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feedback`.`users_has_application` (
`user_id` INT NOT NULL,
`application_id` INT NOT NULL,
PRIMARY KEY (`user_id`, `application_id`),
INDEX `fk_users_has_application_application1_idx` (`application_id` ASC),
INDEX `fk_users_has_application_users_idx` (`user_id` ASC),
CONSTRAINT `fk_users_has_application_users`
FOREIGN KEY (`user_id`)
REFERENCES `feedback`.`user` (`user_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_users_has_application_application1`
FOREIGN KEY (`application_id`)
REFERENCES `feedback`.`application` (`application_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `feedback`.`survey`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feedback`.`survey` (
`survey_id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(45) NULL,
`description` VARCHAR(255) NULL,
`is_active` TINYINT(1) NULL,
PRIMARY KEY (`survey_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `feedback`.`question`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feedback`.`question` (
`question_id` INT NOT NULL,
`question_text` VARCHAR(255) NULL,
PRIMARY KEY (`question_id`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `feedback`.`option`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feedback`.`option` (
`option_id` INT NOT NULL AUTO_INCREMENT,
`question_id` INT NOT NULL,
`option_number` INT NOT NULL,
`option_text` TEXT NULL,
INDEX `fk_option_question1_idx` (`question_id` ASC),
PRIMARY KEY (`option_id`),
UNIQUE INDEX `uk_question_option_number_key` (`question_id` ASC, `option_number` ASC),
CONSTRAINT `fk_option_question1`
FOREIGN KEY (`question_id`)
REFERENCES `feedback`.`question` (`question_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `feedback`.`answer`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feedback`.`answer` (
`answer_id` INT NOT NULL AUTO_INCREMENT,
`user_id` INT NOT NULL,
`option_id` INT NOT NULL,
`date_submitted` DATETIME NOT NULL,
PRIMARY KEY (`answer_id`),
INDEX `fk_answer_user1_idx` (`user_id` ASC),
INDEX `fk_answer_option1_idx` (`option_id` ASC),
CONSTRAINT `fk_answer_user1`
FOREIGN KEY (`user_id`)
REFERENCES `feedback`.`user` (`user_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_answer_option1`
FOREIGN KEY (`option_id`)
REFERENCES `feedback`.`option` (`option_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `feedback`.`survey_has_question`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `feedback`.`survey_has_question` (
`survey_id` INT NOT NULL,
`question_id` INT NOT NULL,
`question_number` INT NULL,
PRIMARY KEY (`survey_id`, `question_id`),
INDEX `fk_survey_has_question_question1_idx` (`question_id` ASC),
INDEX `fk_survey_has_question_survey1_idx` (`survey_id` ASC),
UNIQUE INDEX `unique_order_key` (`survey_id` ASC, `question_number` ASC),
CONSTRAINT `fk_survey_has_question_survey1`
FOREIGN KEY (`survey_id`)
REFERENCES `feedback`.`survey` (`survey_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_survey_has_question_question1`
FOREIGN KEY (`question_id`)
REFERENCES `feedback`.`question` (`question_id`)
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;
Error:
#1005 - Can't create table 'feedback.answer' (errno: 150)
I am creating my table from this as a template:
https://dba.stackexchange.com/questions/16002/survey-database-design-associate-an-answer-to-a-user/16047#16047
My thought process for adding answer_id to the answer table is that I want users to be able to fill out the same survey multiple times.
Why is the answer table throwing an error?
EDIT:
Server version: 5.5.29-0ubuntu0.12.04.2
I am importing this using phpmyadmin
Your code worked on MYSQL server 5.1 without errors.
A common cause of errno: 150 is when you create a FK constraint that references a PK that does not yet exist. Make sure both your "user" and "option" tables are created first before you create the "answer" table.
To help debug you can remove the FK constraints one at a time to see which one is triggering the problem.
If you execute the code in the order shown, I do not see any FK problems that would occur.
try this
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='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Table `feedback`.`application`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `application` (
`application_id` INT NOT NULL AUTO_INCREMENT,
`app_name` VARCHAR(45) NULL,
PRIMARY KEY (`application_id`),
UNIQUE INDEX `app_name_UNIQUE` (`app_name` ASC))
;
your working code in fiddle