Rumah > pangkalan data > tutorial mysql > Bagaimanakah saya boleh memasukkan atau mengemas kini baris dengan cekap dalam jadual pangkalan data berdasarkan dua syarat menggunakan satu pernyataan SQL?

Bagaimanakah saya boleh memasukkan atau mengemas kini baris dengan cekap dalam jadual pangkalan data berdasarkan dua syarat menggunakan satu pernyataan SQL?

Mary-Kate Olsen
Lepaskan: 2024-12-29 07:38:11
asal
534 orang telah melayarinya

How can I efficiently insert or update rows in a database table based on two conditions using a single SQL statement?

MASUKKAN KE DALAM atau KEMASKINI dengan Dua Syarat

Pertanyaan ini melibatkan cabaran mengurus data dengan cekap dalam jadual di mana baris baharu dimasukkan dan sedia ada baris perlu dikemas kini berdasarkan syarat tertentu. Jadual mempunyai skema berikut:

ID INTEGER PRIMARY KEY AUTOINCREMENT
name INTEGER
values1 INTEGER
values2 INTEGER
dates DATE
Salin selepas log masuk

Objektifnya adalah untuk memasukkan baris baharu apabila terdapat data baharu untuk gabungan 'nama' dan 'tarikh' yang diberikan. Walau bagaimanapun, jika baris dengan 'nama' dan 'tarikh' yang sama sudah wujud, ia harus dikemas kini dan bukannya memasukkan baris pendua.

Penyelesaian awal boleh melibatkan penggunaan Prosedur Tersimpan (SPROC) untuk semak keadaan dan laksanakan tindakan yang sewajarnya. Walau bagaimanapun, memandangkan data ditolak daripada bahasa lain, pendekatan ini tidak boleh dilaksanakan.

Penyelesaian optimum terletak pada penggunaan sintaks INSERT INTO ... PADA sintaks KEMASKINI KUNCI DUA. Ini membenarkan satu pernyataan untuk memasukkan baris baharu dan mengemas kini baris sedia ada berdasarkan syarat yang ditentukan.

Dalam senario ini, anda boleh menentukan kunci komposit unik (nama, tarikh) pada jadual:

unique key(name,dates)
Salin selepas log masuk

Kunci unik ini memastikan gabungan 'nama' dan 'tarikh' tidak boleh wujud dalam jadual lebih daripada sekali. Apabila melaksanakan pertanyaan INSERT, anda boleh menggunakan klausa ON DUPLICATE KEY UPDATE untuk menentukan tindakan yang perlu diambil jika pelanggaran kunci unik berlaku:

INSERT INTO myThing (name, values1, values2, dates)
VALUES (777, 1, 1, '2015-07-11')
ON DUPLICATE KEY UPDATE values2 = values2 + 1;
Salin selepas log masuk

Dengan pendekatan ini, jika baris dengan 'nama' dan 'tarikh' yang disediakan sudah wujud, lajur nilai2nya akan ditambah dan bukannya membuat baris baharu. Tingkah laku ini mengemas kini baris sedia ada dengan data baharu dengan berkesan.

Untuk menggambarkan kefungsian, pertimbangkan contoh berikut:

-- Create the table with the composite unique key
CREATE TABLE myThing (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name INT NOT NULL,
    values1 INT NOT NULL,
    values2 INT NOT NULL,
    dates DATE NOT NULL,
    UNIQUE KEY (name, dates)
);

-- Insert a new row or update an existing row
INSERT INTO myThing (name, values1, values2, dates)
VALUES (777, 1, 1, '2015-07-11')
ON DUPLICATE KEY UPDATE values2 = values2 + 1;

-- Insert another new row or update the existing row for 'name' 777
INSERT INTO myThing (name, values1, values2, dates)
VALUES (777, 1, 1, '2015-07-11')
ON DUPLICATE KEY UPDATE values2 = values2 + 1;

-- Insert a new row for 'name' 778
INSERT INTO myThing (name, values1, values2, dates)
VALUES (778, 1, 1, '2015-07-11')
ON DUPLICATE KEY UPDATE values2 = values2 + 1;

-- Retrieve the results
SELECT * FROM myThing;
Salin selepas log masuk

Ini akan menghasilkan output berikut:

+----+------+---------+---------+------------+
| id | name | values1 | values2 | dates      |
+----+------+---------+---------+------------+
| 1  | 777  | 1       | 2       | 2015-07-11 |
| 2  | 778  | 1       | 1       | 2015-07-11 |
+----+------+---------+---------+------------+
Salin selepas log masuk

Seperti yang terbukti, baris untuk 'nama' 777 telah dikemas kini dengan data baharu, manakala baris baharu dicipta untuk 'nama' 778.

Atas ialah kandungan terperinci Bagaimanakah saya boleh memasukkan atau mengemas kini baris dengan cekap dalam jadual pangkalan data berdasarkan dua syarat menggunakan satu pernyataan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan