EROR: Kesalahan 1005: Tidak dapat membuat tabel (errno: 121)

108

Saya memiliki masalah dengan forward engineeringdatabase MySQL saya ke server WAMP .. Saya akan memposting gambar skema tetapi karena ini adalah posting pertama saya, saya tidak bisa.

Di bawah ini adalah skrip yang dieksekusi ..

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;

Tapi kemudian saya mendapatkan kesalahan ini:

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

Saya tidak tahu mengapa. Ada yang bisa bantu saya?

pengguna1703514
sumber
2
Jika Anda memiliki izin admin di server, Anda mungkin ingin memulai dengan menjalankan perintah MySQL "SHOW INNODB STATUS" (atau MySQL 5.5 "SHOW ENGINE INNODB STATUS") segera setelah menerima kesalahan. Perintah ini menampilkan info log dan detail kesalahan. Dari sana Anda dapat melihat di mana kesalahannya
Dorvalla
1
Jawaban @Dorvalla menyelesaikannya. Faktanya, log kesalahan detail disimpan di LATEST FOREIGN KEY ERRORbagian statuskolom saat Anda menjalankan perintah status INNODB.
Devy

Jawaban:

237

Aku mencarimu dengan cepat, dan itu membawaku ke sini . Saya mengutip:

Anda akan mendapatkan pesan ini jika Anda mencoba menambahkan batasan dengan nama yang sudah digunakan di tempat lain

Untuk memeriksa batasan, gunakan kueri SQL berikut:

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

Cari informasi lebih lanjut di sana, atau coba lihat di mana kesalahan terjadi. Sepertinya ada masalah dengan kunci asing bagi saya.

Dorvalla
sumber
Sejauh ini jawaban ini yang terbaik .. terima kasih .. jadi yang muncul adalah ada 3 kendala, 2 di antaranya sama ... tapi eh yang sama berasal dari tabel yang saya hapus sebelumnya? Jadi apa yang saya lakukan?
pengguna1703514
1
Coba utas ini Coba hapus pembatas, jika tidak Anda mengubahnya. Saya tidak yakin bagaimana caranya, karena saya tidak familier dengannya, tetapi akan terlihat logis jika Anda dapat memunculkan batasan, Anda dapat menghapusnya juga, atau mengubahnya.
Dorvalla
Paling umum Anda mencoba menggunakan nama kunci asing yang sama dua kali!
Harm
26

Nama Batasan Kunci Asing Harus Unik Dalam Database

Baik jawaban @ Dorvalla dan posting blog yang disebutkan di atas ini mengarahkan saya ke arah yang benar untuk memperbaiki masalah untuk diri saya sendiri; mengutip dari yang terakhir:

Jika tabel yang Anda coba buat menyertakan batasan kunci asing, dan Anda telah memberikan nama Anda sendiri untuk batasan itu, ingatlah bahwa itu harus unik dalam database.

Saya tidak menyadarinya. Saya telah mengubah nama batasan kunci asing saya sesuai dengan skema berikut yang tampaknya juga digunakan oleh aplikasi Ruby on Rails:

<TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk

Untuk tabel OP ini akan menjadi Link_lession_id_fk , misalnya.

Chriki
sumber
6

Anda dapat login ke mysql dan mengetik

mysql> SHOW INNODB STATUS\G

Anda akan memiliki semua output dan Anda harus memiliki gagasan yang lebih baik tentang apa kesalahannya.

Marc
sumber
1
Di MySQL 5.5, ini SHOW ENGINE INNODB STATUS. Dan itu harus dijalankan segera setelah mendapatkan kesalahan untuk mendapatkan info yang relevan.
Devy
2

Jika Anda memiliki definisi kunci asing di beberapa tabel dan nama kunci asing digunakan di tempat lain sebagai kunci asing lain, Anda akan mengalami kesalahan ini.

giuseppe
sumber
2

Saya menghadapi kesalahan ini (errno 121) tetapi itu disebabkan oleh tabel perantara yang dibuat mysql yang telah menjadi yatim piatu, mencegah saya mengubah tabel meskipun tidak ada nama batasan seperti itu di salah satu tabel saya. Pada titik tertentu, MySQL saya macet atau gagal membersihkan tabel perantara (nama tabel yang dimulai dengan # sql-) yang akhirnya memberi saya kesalahan seperti: Tidak dapat membuat tabel '# sql-' (errno 121) saat mencoba menjalankan ALTER TABLE dengan nama batasan tertentu.

Menurut dokumen di http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html , Anda dapat mencari tabel yatim piatu ini dengan:

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

Versi yang saya gunakan adalah 5.1, tetapi perintah di atas hanya berfungsi pada versi> = 5.6 (manual salah tentang ini berfungsi untuk 5.5 atau sebelumnya, karena INNODB_SYS_TABLES tidak ada dalam versi seperti itu). Saya dapat menemukan tabel sementara yatim piatu (yang tidak cocok dengan yang disebutkan dalam pesan) dengan mencari direktori data mysql saya di baris perintah:

find . -iname '#*'

Setelah menemukan nama file, seperti # sql-9ad_15.frm, saya dapat menghapus tabel yatim piatu itu di MySQL:

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

Setelah melakukannya, saya kemudian dapat menjalankan ALTER TABLE saya dengan sukses.

Untuk kelengkapan, sesuai dengan dokumentasi MySQL yang ditautkan, "awalan # mysql50 # memberi tahu MySQL untuk mengabaikan pengodean aman nama file yang diperkenalkan di MySQL 5.1."

Patrick Brown
sumber
1

Jika Anda ingin memperbaiki dengan cepat, Teruskan Engineer lagi dan centang opsi "Hasilkan SKEMA LEPAS" dan lanjutkan.

Saya berasumsi bahwa database tidak berisi data, jadi menghapusnya tidak akan berpengaruh.

itsraja
sumber
0

Sesuatu yang saya perhatikan adalah bahwa saya memiliki "other_database" dan "Other_Database" di database saya. Itu menyebabkan masalah ini karena saya sebenarnya memiliki referensi yang sama di database lain yang menyebabkan kesalahan misterius ini!

Roozbeh G
sumber
-3
mysql> SHOW ENGINE INNODB STATUS;

Tapi dalam kasus saya hanya cara ini yang bisa membantu:
1. Membuat backup DB saat ini
2. Drop DB (tidak semua tabel, tapi DB)
3. Membuat DB (periksa apakah Anda masih memiliki hak)
4. Pulihkan DB dari backup

phpWebStudio
sumber