I am learning about relational databases and I have a problem when relating two tables with an auxiliary with a relationship of many to many.
I am trying to relate two tables that have a varchar field as the primary key generating an auxiliary table but it gives me error Cannot add foreign key constraint
I have a series of doubts: 1º Is it possible to make this relationship with a varchar field type? I've tried changing fields by INT and if it works correctly.
2nd I have tried to relate a table with another from 1 to many and with the varchar data type if it works.
Attached image of the model. Thanks and best regards.
EDIT1:
Copy the creation is the sentence.
-- 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='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Schema inver
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema inver
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS 'inver' DEFAULT CHARACTER SET utf8 ;
USE 'inver' ;
-- -----------------------------------------------------
-- Table 'inver'.'users'
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS 'inver'.'users' (
'id_user' INT(11) NOT NULL AUTO_INCREMENT,
'name' VARCHAR(45) NULL DEFAULT NULL,
'surname' VARCHAR(45) NULL DEFAULT NULL,
'email' VARCHAR(45) NULL DEFAULT NULL,
'password' VARCHAR(230) NULL DEFAULT NULL,
'role' VARCHAR(45) NULL DEFAULT NULL,
PRIMARY KEY ('id_user'))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table 'inver'.'greenhouse'
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS 'inver'.'greenhouse' (
'fiwareServicePath' VARCHAR(45) NOT NULL,
'metros' VARCHAR(45) NULL,
'lugar' VARCHAR(45) NULL,
'users_id_user' INT(11) NOT NULL,
INDEX 'fk_greenhouse1_users1_idx' ('users_id_user' ASC),
PRIMARY KEY ('fiwareServicePath'),
CONSTRAINT 'fk_greenhouse1_users1'
FOREIGN KEY ('users_id_user')
REFERENCES 'inver'.'users' ('id_user')
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table 'inver'.'sensors'
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS 'inver'.'sensors' (
'entityId' VARCHAR(45) NOT NULL,
'sensor_name' VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_spanish_ci' NULL DEFAULT NULL,
PRIMARY KEY ('entityId'))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_spanish_ci;
-- -----------------------------------------------------
-- Table 'inver'.'sensors_has_greenhouse'
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS 'inver'.'sensors_has_greenhouse' (
'sensors_entityId' VARCHAR(45) NOT NULL,
'greenhouse_fiwareServicePath' VARCHAR(45) NOT NULL,
PRIMARY KEY ('greenhouse_fiwareServicePath', 'sensors_entityId'),
INDEX 'fk_sensors_has_greenhouse_greenhouse1_idx' ('greenhouse_fiwareServicePath' ASC),
INDEX 'fk_sensors_has_greenhouse_sensors1_idx' ('sensors_entityId' ASC),
CONSTRAINT 'fk_sensors_has_greenhouse_sensors1'
FOREIGN KEY ('sensors_entityId')
REFERENCES 'inver'.'sensors' ('entityId')
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT 'fk_sensors_has_greenhouse_greenhouse1'
FOREIGN KEY ('greenhouse_fiwareServicePath')
REFERENCES 'inver'.'greenhouse' ('fiwareServicePath')
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_spanish_ci;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
EDIT2
I add the error:
Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
SQL Code:
-- -----------------------------------------------------
-- Table 'inver'.'sensors_has_greenhouse'
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS 'inver'.'sensors_has_greenhouse' (
'sensors_entityId' VARCHAR(45) NOT NULL,
'greenhouse_fiwareServicePath' VARCHAR(45) NOT NULL,
PRIMARY KEY ('greenhouse_fiwareServicePath', 'sensors_entityId'),
INDEX 'fk_sensors_has_greenhouse_greenhouse1_idx' ('greenhouse_fiwareServicePath' ASC),
INDEX 'fk_sensors_has_greenhouse_sensors1_idx' ('sensors_entityId' ASC),
CONSTRAINT 'fk_sensors_has_greenhouse_sensors1'
FOREIGN KEY ('sensors_entityId')
REFERENCES 'inver'.'sensors' ('entityId')
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT 'fk_sensors_has_greenhouse_greenhouse1'
FOREIGN KEY ('greenhouse_fiwareServicePath')
REFERENCES 'inver'.'greenhouse' ('fiwareServicePath')
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_spanish_ci
SQL script execution finished: statements: 8 succeeded, 1 failed
Fetching back view definitions in final form.
Nothing to fetch