Tambahkan Kunci Asing ke tabel yang ada

324

Saya ingin menambahkan Kunci Asing ke tabel yang disebut "Katalog".

ALTER TABLE katalog 
ADD CONSTRAINT `fk_katalog_sprache` 
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;

Ketika saya mencoba melakukan ini, saya mendapatkan pesan kesalahan ini:

Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150)

Kesalahan dalam Status INNODB:

120405 14:02:57 Kesalahan dalam batasan kunci asing tabel mytable. # Sql-7fb1_7d3a:

FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL:
Cannot resolve table name close to:
(`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL

Ketika saya menggunakan kueri ini berfungsi, tetapi dengan tindakan "menghapus" yang salah:

ALTER TABLE `katalog` 
ADD FOREIGN KEY (`Sprache` ) REFERENCES `sprache` (`ID` )

Kedua tabel adalah InnoDB dan kedua bidang "INT (11) bukan nol". Saya menggunakan MySQL 5.1.61. Mencoba untuk memecat Permintaan ALTER ini dengan MySQL Workbench (terbaru) di MacBook Pro.

Tabel Membuat Pernyataan:

CREATE TABLE `katalog` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`AnzahlSeiten` int(4) unsigned NOT NULL,
`Sprache` int(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `katalogname_uq` (`Name`)
 ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$

CREATE TABLE `sprache` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
 `Bezeichnung` varchar(45) NOT NULL,
 PRIMARY KEY (`ID`),
 UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`),
KEY `ix_sprache_id` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
frgtv10
sumber
1
Karena Anda tidak memposting output SHOW CREATE TABLE, saya hanya bisa bertanya - apakah nama kolom benar-benar ID, ditulis dengan huruf besar?
NB
Yah, lebih mudah dikenali sekarang - katalogsudah int(11) unsigned. sprachetidak memiliki usignedbagian, oleh karena itu dua kolom tidak sama.
NB
Apakah maksud Anda, kedua bidang Utama harus tipe data yang sama?
frgtv10
2
Ini adalah masalah dengan desain Anda: pertama, Anda mereferensikan dua auto_incrementkolom yang buruk. Juga, manual MySQL mengatakan: Corresponding columns in the foreign key and the referenced key must have similar internal data types inside InnoDB so that they can be compared without a type conversion. The size and sign of integer types must be the same. The length of string types need not be the same. For nonbinary (character) string columns, the character set and collation must be the same.. Karena itu, ya, tipe data yang serupa dan tanda yang sama.
NB
2
Saya tidak merujuk dua bidang auto_increment. Katalog.Sprache (bukan otomatis) -> sprache.ID (otomatis)
frgtv10

Jawaban:

560

Untuk menambahkan kunci asing (grade_id) ke tabel (pengguna) yang ada, ikuti langkah-langkah berikut:

ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0;
ALTER TABLE users ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id);
iltaf khalid
sumber
12
Alasan membantu saya memahami dan mengingat. Ini karena Anda tidak dapat menambahkan kunci asing ke bidang yang tidak ditandatangani, benar?
PixMach
8
@PixMach, jawabannya adalah tidak. Anda dapat memiliki bilangan bulat yang ditandatangani sebagai kunci asing. Seperti dicatat NB pada pertanyaan, jenis dan tanda bidang harus cocok. Jadi, jika kunci utama Anda di tabel pencarian TIDAK DITANDATANGANI, maka bidang kunci asing juga harus TIDAK DITANDATANGANI. Jika bidang kunci utama DITANDATANGANI, maka bidang kunci asing juga harus ditandatangani. Pikirkan seperti ini: apa pun kolom dalam satu tabel didefinisikan sebagai dalam SHOW CREATE TABLE, ia harus memiliki definisi yang sama di tabel lainnya.
Ben Keene
1
Perhatikan bahwa ini juga dapat dilakukan dengan satu permintaan (mungkin lebih baik jika terjadi kegagalan dll)
Stijn de Witt
6
Saya harus menjalankan "SET FOREIGN_KEY_CHECKS = 0;" sebelum menjalankan perintah ADD CONSTRAINT atau SQL akan mengeluh "Tidak dapat menambah atau memperbarui baris anak: batasan kunci asing gagal".
Erin Geyer
2
Jangan tidak hanya menjalankan "FOREIGN_KEY_CHECKS SET = 0;" jika Anda mendapatkan kesalahan "batasan kunci asing gagal", Anda jelas memiliki data buruk yang harus Anda perbaiki atau Anda akan mendapatkan masalah yang lebih besar di telepon.
MazeChaZer
72

Cukup gunakan kueri ini, saya telah mencobanya sesuai skenario saya dan berfungsi dengan baik

ALTER TABLE katalog ADD FOREIGN KEY (`Sprache`) REFERENCES Sprache(`ID`);
SagarPPanchal
sumber
25

Langkah Sederhana ...

ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name)
Amjath Khan
sumber
15

periksa tautan ini. Ini telah membantu saya dengan errno 150: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

Di atas kepala saya ada dua hal yang terlintas di benak saya.

  • Apakah indeks kunci asing Anda nama unik di seluruh basis data (# 3 dalam daftar)?
  • Apakah Anda mencoba mengatur PK tabel ke NULL pada pembaruan (# 5 dalam daftar)?

Saya menduga masalahnya adalah dengan set NULL pada pembaruan (jika otak saya tidak mundur hari ini seperti yang sering terjadi ...).

Sunting: Saya melewatkan komentar di posting asli Anda. Kolom int yang tidak ditandatangani / tidak ditandatangani mungkin menyelesaikan kasus Anda. Semoga tautan saya membantu seseorang di masa depan.

ZZ-bb
sumber
13
FOREIGN KEY (`Sprache`)
REFERENCES `Sprache` (`ID`)
ON DELETE SET NULL
ON UPDATE SET NULL;

Tetapi meja Anda memiliki:

CREATE TABLE `katalog` (
`Sprache` int(11) NOT NULL,

Ini tidak dapat mengatur kolom Sprache ke NULL karena didefinisikan sebagai NOT NULL.

Tagihan
sumber
5

MySQL akan menjalankan kueri ini:

ALTER TABLE `db`.`table1`
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL,
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC),
ADD CONSTRAINT `col_table2_fk1`
FOREIGN KEY (`col_table2_fk`)
REFERENCES `db`.`table2` (`table2_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION;

Bersulang!

akelec
sumber
5

Bagaimana cara memperbaiki Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) in mysql.

  1. ubah tabel Anda dan tambahkan indeks ke sana ..

    ALTER TABLE users ADD INDEX index_name (index_column)
  2. Sekarang tambahkan kendala

    ALTER TABLE foreign_key_table
    ADD CONSTRAINT foreign_key_name FOREIGN KEY (foreign_key_column)
    REFERENCES primary_key_table (primary_key_column) ON DELETE NO ACTION
    ON UPDATE CASCADE;

Catatan jika Anda tidak menambahkan indeks, itu tidak akan berfungsi.

Setelah berjuang dengan itu selama sekitar 6 jam saya datang dengan solusi saya harap ini menyelamatkan jiwa.

Kwed
sumber
4

Saat Anda menambahkan batasan kunci asing ke tabel menggunakan ALTER TABLE, ingat untuk membuat indeks yang diperlukan terlebih dahulu.

  1. Buat indeks
  2. Ubah tabel
Maksym Polshcha
sumber
Saya membuat indeks untuk keduanya. Ketika saya mencoba menjalankan saya mendapatkan pesan kesalahan yang sama seperti sebelumnya. Ketika saya melepaskan bagian "pada penghapusan saat pembaruan" itu berfungsi tetapi dengan tindakan "pada penghapusan" yang salah;)
frgtv10
@ frgtv10 kemungkinan besar konflik data tabel dengan "on delete".
Maksym Polshcha
3

coba semua dalam satu permintaan

  ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0,
      ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id);
manoj
sumber
0

ini pada dasarnya terjadi karena meja Anda berada dalam dua rangkaian karakter yang berbeda. sebagai contoh satu tabel dibuat di charset = utf-8 dan tabel lainnya dibuat di CHARSET = latin1 sehingga Anda ingin dapat menambahkan kunci foriegn ke tabel ini. gunakan charset yang sama di kedua tabel maka Anda akan dapat menambahkan kunci foriegn. error 1005 foriegn key constraint yang terbentuk secara salah dapat diselesaikan dari ini

Pumudu Fernando
sumber
0

saya melewati masalah yang sama. Saya kasus saya tabel sudah memiliki data dan ada kunci dalam tabel ini yang tidak ada dalam tabel referensi. Jadi saya harus menghapus baris ini yang tidak menghargai kendala dan semuanya berfungsi.

Henrique
sumber
0

langkah 1: jalankan skrip ini

SET FOREIGN_KEY_CHECKS=0;

langkah 2: tambahkan kolom

ALTER TABLE mileage_unit ADD COLUMN COMPANY_ID BIGINT(20) NOT NULL

langkah 3: tambahkan kunci asing ke kolom yang ditambahkan

ALTER TABLE mileage_unit
ADD FOREIGN KEY (COMPANY_ID) REFERENCES company_mst(COMPANY_ID);

langkah 4: jalankan skrip ini

SET FOREIGN_KEY_CHECKS=1;
satpute rushikesh
sumber
-1
 ALTER TABLE TABLENAME ADD FOREIGN KEY (Column Name) REFERENCES TableName(column name)

Contoh:-

ALTER TABLE Department ADD FOREIGN KEY (EmployeeId) REFERENCES Employee(EmployeeId)
Harshitha Nagabhushana
sumber
1
Silakan tambahkan beberapa penjelasan ke kode Anda sehingga orang lain dapat belajar darinya
Nico Haase