Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menyalin Baris dari Satu Jadual ke Jadual Lain Semasa Mencegah Pendua?
Menyalin Baris ke Jadual sambil Mengelakkan Pendua
Matlamatnya adalah untuk memindahkan semua baris dari satu jadual (srcTable) ke yang lain (destTable) , tidak termasuk sebarang entri pendua. Walaupun nampaknya mudah untuk menambah klausa WHERE dengan subkueri yang menapis pendua, pendekatan ini boleh gagal.
Isu Subkueri:
Pertanyaan asal adalah seperti berikut :
INSERT INTO destTable SELECT * FROM srcTable WHERE NOT EXISTS(SELECT * FROM destTable)
Walau bagaimanapun, pertanyaan ini tidak memasukkan sebarang baris kerana subquery mengembalikan semua baris daripada destTable, tidak kira sama ada ia sepadan dengan mana-mana baris dalam srcTable. Untuk membuat subkueri berfungsi, ia mesti memasukkan syarat tambahan untuk mengenal pasti baris pendua berdasarkan medan yang berkaitan.
Subkueri Disemak:
INSERT INTO destTable SELECT Field1, Field2, Field3, ... FROM srcTable WHERE NOT EXISTS(SELECT * FROM destTable WHERE (srcTable.Field1 = DestTable.Field1 AND srcTable.Field2 = DestTable.Field2 ... etc.))
Subkueri yang disemak ini membandingkan spesifik medan untuk menentukan pendua dan mengecualikannya daripada sisipan.
Alternatif Sambungan Luar:
Pendekatan alternatif ialah menggunakan sambung luar:
INSERT INTO destTable SELECT s.field1, s.field2, s.field3,... FROM srcTable s LEFT JOIN destTable d ON (d.Key1 = s.Key1 AND d.Key2 = s.Key2 AND...) WHERE d.Key1 IS NULL
Teknik sambung luar ini menapis baris daripada srcTable yang mempunyai kunci sepadan dalam destTable, tidak termasuk pendua semasa sisipan.
Mengatasi Pendua Jadual Sumber:
Jika kebimbangan adalah SourceTable mengandungi baris pendua, pertanyaan perlu diubah suai untuk memilih baris yang berbeza:
INSERT INTO destTable SELECT DISTINCT Field1, Field2, Field3,... FROM srcTable
Memasukkan nama medan tertentu dalam pernyataan INSERT disyorkan daripada menggunakan SELECT *.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menyalin Baris dari Satu Jadual ke Jadual Lain Semasa Mencegah Pendua?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!