त्रुटि: त्रुटि 1005: तालिका नहीं बना सकते (ग़लती से: 121)


108

मुझे forward engineeringअपने MySQL डेटाबेस के साथ WAMP सर्वर में परेशानी है .. मैं स्कीमा की एक छवि पोस्ट करने जा रहा था लेकिन यह मेरी पहली पोस्ट नहीं है।

नीचे निष्पादित स्क्रिप्ट है ..

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', 'may@gmail.com', 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', 'layla@gmail.com', 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', 'mama@yahoo.com', 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', 'lk@hotmail.com', 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', 'jackied@gmail.com', 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', 'mark@gmail.com', 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;

लेकिन तब मुझे यह त्रुटि मिलती है:

Executing SQL script in server
ERROR: Error 1005: Can't create table 'aquaticstar.link' (errno: 121)

मैं यह क्यों नहीं समझ सकता। क्या कोई मेरी मदद कर सकता है?


2
यदि आपके पास सर्वर पर व्यवस्थापक की अनुमति है, तो आप त्रुटि प्राप्त करने के तुरंत बाद MySQL कमांड “SHOW INNODB STATUS” (या MySQL 5.5 “SHOW इंजन INNODB STATUS”) चलाकर शुरू करना चाह सकते हैं। यह आदेश लॉग जानकारी और त्रुटि विवरण प्रदर्शित करता है। वहाँ से आप यह देख सकते हैं कि यह कहाँ गलत है
डोरवाला

1
@ डोरवाला के उत्तर ने इसे हल कर दिया। वास्तव में, आपके INNODB स्टेटस कमांड को चलाने पर डिटेल एरर लॉग कॉलम के LATEST FOREIGN KEY ERRORसेक्शन में स्टोर हो जाता है status
देवी

जवाबों:


237

मैंने आपके लिए जल्दी खोजा, और यह मुझे यहां लाया । मैं उद्धृत करता हूं:

यदि आप एक नाम के साथ एक बाधा जोड़ने की कोशिश कर रहे हैं, तो आपको यह संदेश मिलेगा

बाधाओं की जाँच करने के लिए निम्नलिखित SQL क्वेरी का उपयोग करें:

SELECT
    constraint_name,
    table_name
FROM
    information_schema.table_constraints
WHERE
    constraint_type = 'FOREIGN KEY'
AND table_schema = DATABASE()
ORDER BY
    constraint_name;

अधिक जानकारी के लिए देखें, या यह देखने का प्रयास करें कि त्रुटि कहां हुई है। मेरे लिए एक विदेशी कुंजी के साथ एक समस्या की तरह लग रहा है।


यह उत्तर अब तक का सबसे अच्छा था .. धन्यवाद .. तो जो आया उसमें 3 अड़चनें थीं, जिनमें से 2 समान हैं ... लेकिन एह वही हैं जो पहले आई डिलीट की गई एक टेबल से आए थे? तो मैं क्या करूं?
user1703514

1
इस धागे को आज़माएं, अड़चन को दूर करने का प्रयास करें, अन्यथा आप इसे बदल दें। मुझे यकीन नहीं है कि कैसे, क्योंकि मैं इसके साथ पारिवारिक नहीं हूं, लेकिन यह तर्कसंगत लगेगा यदि आप बाधाओं को बुला सकते हैं, तो आप उन्हें भी हटा सकते हैं, या उन्हें बदल सकते हैं।
डोरवल्ला

सबसे आम आप दो बार एक ही विदेशी कुंजी नाम का उपयोग करने की कोशिश कर रहे हैं!
हार्म

26

विदेशी मुख्य बाधा नाम एक डेटाबेस के भीतर अद्वितीय होना चाहिए

दोनों @ डॉरवल् का उत्तर और ऊपर उल्लिखित इस ब्लॉग पोस्ट ने मुझे खुद के लिए समस्या को ठीक करने के लिए सही दिशा में इंगित किया; बाद से उद्धृत करना:

यदि आप जिस तालिका को बनाने की कोशिश कर रहे हैं, उसमें एक विदेशी कुंजी बाधा शामिल है, और आपने उस बाधा के लिए अपना नाम प्रदान किया है, तो याद रखें कि यह डेटाबेस के भीतर अद्वितीय होना चाहिए।

मुझे इसकी जानकारी नहीं थी। मैंने निम्नलिखित स्कीमा के अनुसार अपने विदेशी प्रमुख बाधा नामों को बदल दिया है, जो रूबी द्वारा रेल अनुप्रयोगों पर उपयोग किए जाने के लिए प्रकट होता है:

<TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk

ओपी की तालिका के लिए यह होगा Link_lession_id_fk, उदाहरण के लिए।


6

आप mysql पर लॉगिन कर टाइप कर सकते हैं

mysql> SHOW INNODB STATUS\G

आपके पास सभी आउटपुट होंगे और आपके पास बेहतर विचार होना चाहिए कि त्रुटि क्या है।


1
MySQL 5.5 में, यह है SHOW ENGINE INNODB STATUS। और संबंधित जानकारी प्राप्त करने के लिए त्रुटि प्राप्त करने के तुरंत बाद इसे चलाना होगा।
देवी

2

यदि आपके पास किसी तालिका में एक विदेशी कुंजी परिभाषा है और विदेशी कुंजी का नाम अन्य विदेशी कुंजी के रूप में अन्यत्र उपयोग किया जाता है, तो आपके पास यह त्रुटि होगी।


2

मुझे इस त्रुटि (121 तक) का सामना करना पड़ा, लेकिन यह mysql द्वारा बनाई गई मध्यवर्ती तालिकाओं के कारण था जो अनाथ हो गए थे, मुझे एक तालिका को बदलने से रोक रहे थे, हालांकि इस तरह की कोई बाधा नाम मेरे किसी भी तालिका में मौजूद नहीं था। कुछ बिंदु पर, मेरा MySQL दुर्घटनाग्रस्त हो गया था या एक मध्यवर्ती तालिका (एक # sql- के साथ शुरू होने वाले तालिका नाम) को साफ करने में विफल रहा था, जो मुझे एक त्रुटि के साथ पेश करने के लिए समाप्त हो गई जैसे: तालिका '# sql-' (त्रुटी 121) नहीं बना सकती। जब कुछ बाधाओं के नाम के साथ एक परिवर्तन चलाने की कोशिश कर रहा है।

Http://dev.mysql.com/doc/refman/5.7/en/innodb-troublesourcing-datadict.html पर डॉक्स के अनुसार , आप इन अनाथ तालिकाओं की खोज कर सकते हैं:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql%';

मैं जिस संस्करण के साथ काम कर रहा था वह 5.1 था, लेकिन उपरोक्त कमांड केवल संस्करणों पर काम करता है> = 5.6 (मैनुअल 5.5 या इससे पहले काम करने के बारे में गलत है, क्योंकि INNODB_SYS_TABLES ऐसे संस्करणों में मौजूद नहीं है)। मैं अपने mysql डेटा डायरेक्टरी को कमांड लाइन में खोजकर अनाथ अस्थायी तालिका (जो संदेश में दिए गए नाम से मेल नहीं खाता) को खोजने में सक्षम था:

find . -iname '#*'

फ़ाइल नाम की खोज करने के बाद, जैसे कि # sql-9ad_15.frm, मैं MySQL में उस अनाथ तालिका को छोड़ने में सक्षम था:

USE myschema;
DROP TABLE `#mysql50##sql-9ad_15`;

ऐसा करने के बाद, मैं तब अपने ALTER TABLE को सफलतापूर्वक चलाने में सक्षम था।

पूर्णता के लिए, MySQL प्रलेखन के अनुसार, "# mysql50 # उपसर्ग MySQL को MySQL 5.1 में प्रस्तुत फ़ाइल नाम सुरक्षित एन्कोडिंग को अनदेखा करने के लिए कहता है।"


1

यदि आप जल्दी से ठीक करना चाहते हैं, तो फ़ॉर्वर्ड इंजीनियर को फिर से जाँचें और "DROP SCHEMA उत्पन्न करें" विकल्प देखें और आगे बढ़ें।

मुझे लगता है कि डेटाबेस में डेटा नहीं है, इसलिए इसे छोड़ने से कोई असर नहीं पड़ेगा।


0

मैंने जो कुछ देखा वह यह था कि मेरे डेटाबेस में "other_database" और "Other_Database" थे। इस समस्या के कारण मैं वास्तव में अन्य डेटाबेस में एक ही संदर्भ था जो इस रहस्यमय त्रुटि का कारण बना!


-3
mysql> SHOW ENGINE INNODB STATUS;

लेकिन मेरे मामले में केवल इस तरह से मदद मिल सकती है:
1. करंट डीबी का बैकअप बनाएं
2. डीबी ड्रॉप करें (सभी टेबल नहीं, लेकिन डीबी)
3. डीबी बनाएं (चेक करें कि आपके पास अभी भी प्रीलिम्स हैं)
4. बैकअप से डीबी को पुनर्स्थापित करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.