mysql - create - ERROR: Error 1005: No se puede crear la tabla(errno: 121)
error 1005(hy000) can''t create table(errno 150) mysql (8)
Los nombres de restricción de clave externa deben ser únicos dentro de una base de datos
Tanto la respuesta de @Dorvalla como esta publicación de blog mencionada anteriormente me indicaron la dirección correcta para resolver el problema por mí mismo; Citando de este último:
Si la tabla que intenta crear incluye una restricción de clave externa, y ha proporcionado su propio nombre para esa restricción, recuerde que debe ser exclusivo dentro de la base de datos.
No estaba enterado de eso. Cambié mis nombres de restricción de clave externa de acuerdo con el siguiente esquema que también parece ser utilizado por las aplicaciones de Ruby on Rails:
<TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk
Para la tabla del OP, esto sería Link_lession_id_fk
, por ejemplo.
Tengo problemas con la forward engineering
mi base de datos MySQL en el servidor WAMP. Iba a publicar una imagen del esquema, pero como esta es mi primera publicación, no puedo.
A continuación se muestra el script ejecutado ..
use aquaticstar;
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 `Students`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Students` ;
CREATE TABLE IF NOT EXISTS `Students` (
`id` VARCHAR(10) NOT NULL ,
`studentName` VARCHAR(45) NOT NULL ,
`gender` CHAR NOT NULL ,
`birthDate` DATETIME NOT NULL ,
`mNo` VARCHAR(10) NOT NULL ,
`contactName` VARCHAR(45) NOT NULL ,
`contactEmail` VARCHAR(45) NOT NULL ,
`contactPhone` INT(10) NOT NULL ,
`startDate` DATETIME NOT NULL ,
`remarks` VARCHAR(200) NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Waiting List`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Waiting List` ;
CREATE TABLE IF NOT EXISTS `Waiting List` (
`wait_id` VARCHAR(5) NOT NULL ,
`name` VARCHAR(45) NULL ,
`contactName` VARCHAR(45) NULL ,
`contactPhone` INT(10) NULL ,
`contactEmail` VARCHAR(45) NULL ,
`status` CHAR NULL ,
`remarks` VARCHAR(200) NULL ,
PRIMARY KEY (`wait_id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Schedule`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Schedule` ;
CREATE TABLE IF NOT EXISTS `Schedule` (
`lesson_id` VARCHAR(10) NOT NULL ,
`day` VARCHAR(3) NOT NULL ,
`branch` VARCHAR(30) NOT NULL ,
`level` VARCHAR(30) NOT NULL ,
`time` TIME NOT NULL ,
`ae` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`lesson_id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Link`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Link` ;
CREATE TABLE IF NOT EXISTS `Link` (
`link_id` VARCHAR(10) NOT NULL ,
`id` VARCHAR(10) NOT NULL ,
`lesson_id` VARCHAR(10) NOT NULL ,
PRIMARY KEY (`link_id`) ,
INDEX `id_idx` (`id` ASC) ,
INDEX `lesson_id_idx` (`lesson_id` ASC) ,
CONSTRAINT `id`
FOREIGN KEY (`id` )
REFERENCES `Students` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `lesson_id`
FOREIGN KEY (`lesson_id` )
REFERENCES `Schedule` (`lesson_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Attendance`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Attendance` ;
CREATE TABLE IF NOT EXISTS `Attendance` (
`date` DATETIME NOT NULL ,
`attendance` VARCHAR(5) NOT NULL ,
`link_id` VARCHAR(10) NOT NULL ,
INDEX `link_id_idx` (`link_id` ASC) ,
CONSTRAINT `link_id`
FOREIGN KEY (`link_id` )
REFERENCES `Link` (`link_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;
-- -----------------------------------------------------
-- Data for table `Students`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES (''s001'', ''Sam Khew'', ''m'', ''12/12/1991'', ''nm'', ''May Khew'', ''[email protected]'', 0198829387, ''12/07/2011'', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES (''s002'', ''Joe Biden'', ''m'', ''13/03/2003'', ''nm'', ''Layla Biden'', ''[email protected]'', 0199283763, ''14/05/2011'', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES (''s003'', ''Bob Builder'', ''m'', ''14/02/2002'', ''LK920K'', ''Mama Builder'', ''[email protected]'', 0167728376, ''29/02/2012'', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES (''s004'', ''Kenny Koh'', ''m'', ''18/02/1999'', ''MM992'', ''Lisa Koh'', ''[email protected]'', 0123160231, ''19/01/2012'', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES (''s005'', ''Jane Doe'', ''f'', ''29/09/1999'', ''nm'', ''Jackie Doe'', ''[email protected]'', 0127736254, ''02/03/2012'', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES (''s006'', ''Lola Lai'', ''f'', ''02/05/2004'', ''nm'', ''Mark Lai'', ''[email protected]'', 0198827365, ''11/09/2011'', NULL);
COMMIT;
-- -----------------------------------------------------
-- Data for table `Schedule`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES (''sat1_s4'', ''Sat'', ''Sunway'', ''basic'', ''4pm'', ''Aini'');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES (''sat1_s5'', ''Sat'', ''Sunway'', ''basic'', ''5pm'', ''Aini'');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES (''sat1_s6'', ''Sat'', ''Sunway'', ''basic'', ''6pm'', ''Aini'');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES (''sat2_s4'', ''Sat'', ''Sunway'', ''advance'', ''4pm'', ''Nina'');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES (''sat2_s5'', ''Sat'', ''Sunway'', ''advance'', ''5pm'', ''Nina'');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES (''sat3_s6'', ''Sat'', ''Sunway'', ''pre-comp'', ''6pm'', ''Marcus'');
COMMIT;
-- -----------------------------------------------------
-- Data for table `Link`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES (''L001'', ''s001'', ''sat1_s4'');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES (''L002'', ''s002'', ''sat1_s5'');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES (''L003'', ''s003'', ''sat1_s6'');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES (''L004'', ''s004'', ''sat2_s4'');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES (''L005'', ''s005'', ''sat1_s5'');
COMMIT;
-- -----------------------------------------------------
-- Data for table `Attendance`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Attendance` (`date`, `attendance`, `link_id`) VALUES (''26/9/2012'', ''1'', NULL);
COMMIT;
Pero luego me sale este error:
Executing SQL script in server
ERROR: Error 1005: Can''t create table ''aquaticstar.link'' (errno: 121)
No puedo entender por qué. ¿Alguien puede ayudarme?
Algo que noté fue que tenía "other_database" y "Other_Database" en mis bases de datos. Eso causó este problema ya que en realidad tenía la misma referencia en otra base de datos que causó este error misterioso.
Busqué rápidamente por ti, y me trajo here . Yo cito:
Recibirá este mensaje si está intentando agregar una restricción con un nombre que ya se usó en otro lugar
Para verificar las restricciones, use la siguiente consulta SQL:
SELECT
constraint_name,
table_name
FROM
information_schema.table_constraints
WHERE
constraint_type = ''FOREIGN KEY''
AND table_schema = DATABASE()
ORDER BY
constraint_name;
Busque allí más información o intente ver dónde ocurre el error. Parece un problema con una clave foránea para mí.
Me enfrenté a este error (errno 121) pero fue causado por tablas intermedias creadas por mysql que habían quedado huérfanas, lo que me impedía modificar una tabla a pesar de que no existía tal nombre de restricción en ninguna de mis tablas. En algún momento, mi MySQL se colapsó o falló al limpiar una tabla intermedia (el nombre de la tabla comenzaba con # sql-) que terminó por presentarme un error como: No se puede crear la tabla ''# sql-'' (errno 121) cuando intenta ejecutar ALTER TABLE con ciertos nombres de restricción.
De acuerdo con los documentos en http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html , puede buscar estas tablas huérfanas con:
SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE ''%#sql%'';
La versión con la que estaba trabajando era 5.1, pero el comando anterior solo funciona en las versiones> = 5.6 (el manual es incorrecto porque funciona para 5.5 o anterior, porque INNODB_SYS_TABLES no existe en dichas versiones). Pude encontrar la tabla temporal huérfana (que no coincidía con la nombrada en el mensaje) buscando en mi directorio de datos mysql en línea de comandos:
find . -iname ''#*''
Después de descubrir el nombre del archivo, como # sql-9ad_15.frm, pude eliminar esa tabla huérfana en MySQL:
USE myschema;
DROP TABLE `#mysql50##sql-9ad_15`;
Después de hacerlo, pude ejecutar mi ALTER TABLE con éxito.
Para completar, según la documentación de MySQL vinculada, "el prefijo # mysql50 # le dice a MySQL que ignore la codificación segura del nombre de archivo introducida en MySQL 5.1".
Puede iniciar sesión en mysql y escribir
mysql> SHOW INNODB STATUS/G
Tendrás todos los resultados y deberías tener una mejor idea de cuál es el error.
Si quiere arreglarlo rápidamente, vuelva a enviar a Forward Engineer y marque la opción "Generate DROP SCHEMA" y proceda.
Supongo que la base de datos no contiene datos, por lo que su eliminación no afectará.
Si tiene una definición de clave externa en alguna tabla y el nombre de la clave externa se usa en otro lugar como otra clave externa, tendrá este error.
mysql> SHOW ENGINE INNODB STATUS;
Pero en mi caso solo de esta manera podría ayudar:
1. Haga una copia de seguridad de la base de datos actual
2. Suelta DB (no todas las tablas, pero DB)
3. Crear DB (verifique que todavía tiene previlegios)
4. Restaurar base de datos desde la copia de seguridad