HATA: Hata 1005: Tablo oluşturulamıyor (hata no: 121)


108

forward engineeringMySQL veritabanımla WAMP sunucusuna sorun yaşıyorum .. Şemanın bir görüntüsünü gönderecektim ama bu benim ilk yazım olduğu için yapamam.

Aşağıda çalıştırılan komut dosyası bulunmaktadır ..

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;

Ama sonra şu hatayı alıyorum:

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

Nedenini anlayamıyorum. Biri bana yardım edebilir mi?


2
Sunucuda yönetici izniniz varsa, hatayı aldıktan hemen sonra MySQL komutunu "SHOW INNODB STATUS" (veya MySQL 5.5 "SHOW ENGINE INNODB STATUS") çalıştırarak başlamak isteyebilirsiniz. Bu komut, günlük bilgilerini ve hata ayrıntılarını görüntüler. Oradan nerede yanlış gittiğini görebilirsiniz
Dorvalla

1
@Dorvalla 'nın cevabı sorunu çözdü. Aslında, INNODB durum komutunu çalıştırdığınızda, ayrıntı hata günlüğü sütunun LATEST FOREIGN KEY ERRORbölümünde saklanır status.
Devy

Yanıtlar:


237

Hızlıca seni aradım ve beni buraya getirdi . Alıntı yaparım:

Zaten başka bir yerde kullanılan bir adla bir kısıtlama eklemeye çalışıyorsanız bu mesajı alacaksınız

Kısıtlamaları kontrol etmek için aşağıdaki SQL sorgusunu kullanın:

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

Orada daha fazla bilgi arayın veya hatanın nerede oluştuğunu görmeye çalışın. Bana yabancı anahtarla ilgili bir sorun gibi görünüyor.


Bu cevap şimdiye kadarki en iyisiydi .. teşekkürler .. peki ortaya çıkan 3 kısıt vardı, ikisi aynı ... ama aynı olanlar daha önce sildiğim bir tablodan mı geldi? Yani, ne yapayım?
user1703514

1
Bu diziyi deneyin Kısıtlamayı silmeyi deneyin, yoksa değiştirirsiniz. Nasıl olduğundan emin değilim, çünkü ben buna aşina değilim, ancak kısıtlamaları çağırabilirseniz, onları da silebilir veya değiştirebilirsiniz.
Dorvalla

En yaygın olarak aynı yabancı anahtar adını iki kez kullanmaya çalışıyorsunuz!
Harm

26

Yabancı Anahtar Kısıtlama Adları Bir Veritabanında Benzersiz Olmalıdır

Hem @ Dorvalla'nın yanıtı hem de yukarıda bahsedilen bu blog yazısı , sorunu kendim için çözmem için beni doğru yöne işaret etti; ikincisinden alıntı yaparak:

Oluşturmaya çalıştığınız tablo bir yabancı anahtar kısıtlaması içeriyorsa ve bu kısıtlama için kendi adınızı verdiyseniz, veritabanında benzersiz olması gerektiğini unutmayın.

Bunun farkında değildim. Yabancı anahtar kısıtlama isimlerimi Ruby on Rails uygulamaları tarafından da kullanıldığı görülen aşağıdaki şemaya göre değiştirdim:

<TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk

OP'nin tablosu için bu Link_lession_id_fkörneğin olabilir.


6

Mysql'e giriş yapabilir ve yazabilirsiniz

mysql> SHOW INNODB STATUS\G

Tüm çıktılara sahip olacaksınız ve hatanın ne olduğu konusunda daha iyi bir fikre sahip olmalısınız.


1
MySQL 5.5'te SHOW ENGINE INNODB STATUS. Ve ilgili bilgiyi almak için hatayı aldıktan hemen sonra çalıştırılması gerekir.
Devy

2

Bazı tabloda yabancı anahtar tanımınız varsa ve yabancı anahtarın adı başka bir yabancı anahtar olarak başka bir yerde kullanılıyorsa, bu hatayı alırsınız.


2

Bu hatayla karşılaştım (errno 121), ancak bu, benim tablolarımın hiçbirinde böyle bir kısıtlama adı bulunmamasına rağmen, benim bir tabloyu değiştirmeme engel olan, artık mysql tarafından oluşturulan ara tablolardan kaynaklanıyordu. Bir noktada, MySQL'im çöktü veya bir ara tabloyu (# sql- ile başlayan tablo adı) temizleyemedi, bu da bana şu gibi bir hatayla sonuçlandı: '# sql-' tablosu oluşturulamıyor (errno 121) belirli kısıt adlarıyla bir ALTER TABLE çalıştırmaya çalışırken.

Http://dev.mysql.com/doc/refman/5.7/en/innodb-trfunction-datadict.html adresindeki belgelere göre , bu öksüz tabloları şununla arayabilirsiniz:

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

Üzerinde çalıştığım sürüm 5.1'di, ancak yukarıdaki komut yalnızca> = 5.6 sürümlerinde çalışıyor (manuel, 5.5 veya daha önceki sürümlerde çalıştığı için yanlıştır, çünkü INNODB_SYS_TABLES bu tür sürümlerde mevcut değildir). Komut satırında mysql veri dizinimi arayarak sahipsiz geçici tabloyu (mesajda belirtilenle eşleşmeyen) bulabildim:

find . -iname '#*'

# Sql-9ad_15.frm gibi dosya adını keşfettikten sonra, bu artık tabloyu MySQL'e bırakabildim:

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

Bunu yaptıktan sonra, ALTER TABLE'ımı başarıyla çalıştırabildim.

Bağlantılı MySQL dokümantasyonuna göre, "# mysql50 # öneki MySQL'e MySQL 5.1'de tanıtılan dosya adı güvenli kodlamasını göz ardı etmesini söyler."


1

Hızlı bir şekilde düzeltmek istiyorsanız, Forward Engineer'ı tekrar ve "Generate DROP SCHEMA" seçeneğini işaretleyip devam edin.

Veritabanının veri içermediğini varsayıyorum, bu yüzden düşürmek etkilemeyecek.


0

Veritabanlarımda "other_database" ve "Other_Database" olduğunu fark ettim. Aslında bu gizemli hataya neden olan diğer veritabanlarında aynı referansa sahip olduğum için bu soruna neden oldu!


-3
mysql> SHOW ENGINE INNODB STATUS;

Ancak benim durumumda yalnızca bu yol yardımcı olabilir:
1. Mevcut DB'nin yedeğini alın
2. DB'yi bırakın (tüm tabloları değil, DB'yi bırakın)
3. DB oluşturun (hala öncelikleriniz olup olmadığını kontrol edin)
4. DB'yi yedekten geri yükleyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.