INSERT INTO 或UPDATE 有兩個條件
此查詢涉及有效管理插入新行和現有行的表中的資料的挑戰需要根據具體條件更新行。此表具有以下架構:
ID INTEGER PRIMARY KEY AUTOINCREMENT name INTEGER values1 INTEGER values2 INTEGER dates DATE
目標是當給定的「名稱」和「日期」組合有新資料時插入新行。但是,如果已存在具有相同“名稱”和“日期”的行,則應更新該行,而不是插入重複行。
初始解決方案可能涉及使用預存程序 (SPROC)檢查條件並執行適當的操作。然而,由於數據是從另一種語言推送的,這種方法不可行。
最佳解決方案是利用 INSERT INTO ... ON DUPLICATE KEY UPDATE 語法。這允許單一語句根據指定條件插入新行並更新現有行。
在這種情況下,您可以在表上定義唯一的複合鍵(名稱、日期):
unique key(name,dates)
這個唯一鍵確保「名稱」和「日期」的組合不能在表中多次存在。執行INSERT 查詢時,可以使用ON DUPLICATE KEY UPDATE 子句指定發生唯一鍵違規時要採取的操作:
INSERT INTO myThing (name, values1, values2, dates) VALUES (777, 1, 1, '2015-07-11') ON DUPLICATE KEY UPDATE values2 = values2 + 1;
使用此方法,如果具有'name' 的行並且提供的「日期」已經存在,其values2列將增加而不是建立新行。此行為有效地使用新資料更新現有行。
為了說明該功能,請考慮以下範例:
-- 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;
這將產生以下輸出:
+----+------+---------+---------+------------+ | id | name | values1 | values2 | dates | +----+------+---------+---------+------------+ | 1 | 777 | 1 | 2 | 2015-07-11 | | 2 | 778 | 1 | 1 | 2015-07-11 | +----+------+---------+---------+------------+
很明顯,「name」777 的行已使用新資料進行了更新,同時為「name」建立了一行新行778.
以上是如何使用單一 SQL 語句根據兩個條件有效地在資料庫表中插入或更新資料列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!