Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Menyalin Baris dari Satu Jadual ke Jadual Lain Semasa Mencegah Pendua?

Bagaimanakah Saya Boleh Menyalin Baris dari Satu Jadual ke Jadual Lain Semasa Mencegah Pendua?

Patricia Arquette
Patricia Arquetteasal
2024-12-28 03:06:09430semak imbas

How Can I Copy Rows from One Table to Another While Preventing Duplicates?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn