Mengapa tidak TRUNCATE pada mygroup
pekerjaan? Meskipun saya punya ON DELETE CASCADE SET
saya dapatkan:
GALAT 1701 (42000): Tidak dapat memotong tabel yang dirujuk dalam batasan kunci asing (
mytest
.instance
, CONSTRAINTinstance_ibfk_1
FOREIGN KEY (GroupID
) REFERENSImytest
.mygroup
(ID
))
drop database mytest;
create database mytest;
use mytest;
CREATE TABLE mygroup (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;
CREATE TABLE instance (
ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
GroupID INT NOT NULL,
DateTime DATETIME DEFAULT NULL,
FOREIGN KEY (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE,
UNIQUE(GroupID)
) ENGINE=InnoDB;
mysql
foreign-keys
constraints
truncate
dml
pengguna391986
sumber
sumber
Ya kamu bisa:
Dengan pernyataan ini, Anda berisiko membiarkan dalam baris ke dalam tabel Anda yang tidak mematuhi
FOREIGN KEY
kendala.sumber
;
). Ini karena setiap panggilan SQL web baru akan mengatur ulangFOREIGN_KEY_CHECKS
ke 1.Saya hanya akan melakukannya dengan:
sumber
DELETE
kinerjanya lebih lambat daripadaTRUNCATE
. Tetapi karena tindakan ini biasanya jarang dilakukan, ini tidak masalah.DELETE
dapat benar-benar brutal jika Anda memiliki terlalu banyak baris - karena itu mengenai log, sedangkanTRUNCATE
hanya merobek data. Sangat tergantung pada use case.error 1175: You are using safe update mode,...
perubahan klausa penghapusan untukDELETE FROM mydb.mytable where id != 0
membuatnya sempurna.Anda dapat melakukan
sumber
mytable
Sesuai dokumentasi mysql , TRUNCATE tidak dapat digunakan pada tabel dengan hubungan kunci asing. Tidak ada AFAIK alternatif lengkap.
Menjatuhkan contraint masih tidak meminta ON DELETE dan ON UPDATE. Satu-satunya solusi yang bisa saya pikirkan adalah ATM:
Tampaknya TRUNCATE di MySQL belum merupakan fitur yang lengkap (ini juga tidak memicu pemicu).Lihat komentarsumber
TRUNCATE
tidak lengkap - truncate tidak seharusnya memanggil pemicu, dll. Jika ya, itu akan sama denganDELETE
! Ini agnostik baris, karenanya tidak dapat melakukan operasi terkait baris (seperti mengaktifkan pemicu atau memeriksa kunci asing). Ini bekerja dengan cara yang sama di Oracle dan Sql Server .Mudah jika Anda menggunakan phpMyAdmin.
Hapus centang
Enable foreign key checks
opsi di bawahSQL
tab dan jalankanTRUNCATE <TABLE_NAME>
sumber
Meskipun pertanyaan ini diajukan, saya tidak tahu, tetapi sekarang jika Anda menggunakan phpMyAdmin, Anda cukup membuka basis data dan memilih tabel yang ingin Anda potong.
Empty
opsi di bawah tajukDelete data or table
.Enable foreign key checks
. Cukup batalkan pilihan dan tekanYes
tombol dan tabel yang dipilih akan terpotong.Mungkin secara internal menjalankan kueri yang disarankan dalam jawaban user447951 , tetapi sangat mudah digunakan dari antarmuka phpMyAdmin.
sumber
Diuji pada MYSQL Database
Solusi 1:
Solusi 2:
Ini bekerja untuk saya. Saya harap, ini akan membantu Anda juga. Terima kasih telah mengajukan pertanyaan ini.
sumber
Jawaban memang yang disediakan oleh zerkms , sebagaimana dinyatakan pada Opsi 1 :
Bagian yang sulit adalah Menghilangkan kendala , jadi saya ingin memberi tahu Anda caranya, jika seseorang perlu tahu bagaimana melakukan itu:
Jalankan
SHOW CREATE TABLE <Table Name>
kueri untuk melihat siapa nama KUNCI ASING Anda (Bingkai merah pada gambar di bawah):Lari
ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name>
. Ini akan menghapus batasan kunci asing.Jatuhkan Indeks yang terkait (melalui halaman struktur tabel), dan Anda selesai.
untuk membuat kembali kunci asing:
sumber
Cukup gunakan CASCADE
Tapi bersiaplah untuk menghapus cascade)
sumber
Jika mesin database untuk tabel berbeda Anda akan mendapatkan kesalahan ini jadi ubah ke InnoDB
sumber
Mendapatkan status pemeriksaan kunci asing lama dan mode sql adalah cara terbaik untuk memotong / menjatuhkan tabel seperti yang dilakukan Mysql Workbench saat menyinkronkan model ke database.
sumber