跳轉到內容

MySQL/語言/資料操作

來自華夏公益教科書,開放的書籍,開放的世界

語法如下

將 value1 插入 Column1,value2 插入 Column2,value3 插入 Column3

 INSERT INTO TableName (Column1, Column2, Column3)
 VALUES (value1, value2, value3)

插入一條記錄(值按資料庫中列的順序插入)

 INSERT INTO TableName
 VALUES (value1, value2, value3)

插入兩條記錄

 INSERT INTO TableName
 VALUES (value1, value2, value3), (value4, value5, value6)

 INSERT INTO antiques VALUES (21, 01, 'Ottoman', 200.00);
 INSERT INTO antiques (buyerid, sellerid, item) VALUES (01, 21, 'Ottoman');

您也可以插入從其他表中'選擇'的記錄。

 INSERT INTO table1(field1, field2)
 SELECT field1, field2
 FROM table2

 INSERT INTO World_Events SELECT * FROM National_Events

效能提示

  • 要插入多行,請考慮使用 LOAD DATA INFILE 代替。
  • 如果批次 INSERT 速度太慢,並且它們對索引的非空表進行操作,您可能應該增加 bulk_insert_buffer_size 的值。
  • 在執行批次插入之前,您可能需要停用鍵。
  • 鎖定表也可以加快 INSERT 的速度。

語法是

 UPDATE table SET field1 = newvalue1, field2 = newvalue2 WHERE criteria ORDER BY field LIMIT n

示例如下

 UPDATE owner SET ownerfirstname = 'John'
   WHERE ownerid = (SELECT buyerid FROM antiques WHERE item = 'Bookcase');
 
 UPDATE antiques SET price = 500.00 WHERE item = 'Chair';
 
 UPDATE order SET discount=discount * 1.05
 
 UPDATE tbl1 JOIN tbl2 ON tbl1.ID = tbl2.ID
   SET tbl1.col1 = tbl1.col1 + 1
   WHERE tbl2.status='Active'
 
 UPDATE tbl SET names = REPLACE(names, 'aaa', 'zzz')
 
 UPDATE products_categories AS pc
   INNER JOIN products AS p ON pc.prod_id = p.id
   SET pc.prod_sequential_id = p.sequential_id
 
 UPDATE table_name SET col_name =
   REPLACE(col_name, 'host.domain.com', 'host2.domain.com')

 UPDATE posts SET deleted=True
   ORDER BY date LIMIT 1

使用 ORDER BY,您可以在更新行之前對行進行排序,並且只更新給定數量的行 (LIMIT)。

目前無法在對同一表執行子查詢時更新表。例如,如果我想重置我在 SPIP 中忘記的密碼

mysql> UPDATE spip_auteurs SET pass =
 (SELECT pass FROM spip_auteurs WHERE login='paul') where login='admin';
ERROR 1093 (HY000): You can't specify target table 'spip_auteurs' for update in FROM clause

TODO:描述一個我無法使用 MySQL 4.1 進行操作的解決方法。目前,解決方法是不使用 2 個子查詢,可能使用事務[1]

效能提示

  • UPDATE 的速度取決於更新了多少索引。
  • 如果您更新使用動態格式的 MyISAM 表,如果您使行變大,它們可能會被分成多個部分。這會導致讀取開銷。因此,如果您的應用程式經常這樣做,您可能需要定期執行 OPTIMIZE TABLE 語句。
  • 在鎖定表上一起執行多個 UPDATE 比分別執行它們更快。

REPLACE 的工作方式與 INSERT 完全相同,只是如果表中的一條舊記錄與新記錄的 PRIMARY KEY 或 UNIQUE 索引的值相同,則會在插入新記錄之前刪除舊記錄。

從 MySQL 5.5[2] 開始,“INSERT IGNORE” 和 “REPLACE IGNORE” 允許在出現重複鍵錯誤時顯示一些警告並避免語句中止。

在 MySQL 4.0.1 之前,INSERT ... SELECT 隱式以 IGNORE 模式執行。從 MySQL 4.0.1 開始,請顯式指定 IGNORE 以忽略會導致重複鍵衝突的記錄。

DELETE 和 TRUNCATE

[編輯 | 編輯原始碼]
 DELETE [QUICK] FROM `table1`
 TRUNCATE [TABLE] `table1`
  • 如果您沒有對 DELETE 使用 WHERE 子句,則將刪除所有記錄。
  • 它在一個大型表中可能非常慢,尤其是在表中包含很多索引的情況下。
  • 如果表包含很多索引,您可以增大快取以嘗試使 DELETE 更快 (key_buffer_size 變數)。
  • 對於索引的 MyISAM 表,在某些情況下,如果指定 QUICK 關鍵字,則 DELETE 會更快 (DELETE QUICK FROM ...)。這僅對刪除的索引值將被重用的表有用。
  • TRUNCATE 透過 DROP 和重新建立表來快速刪除所有行(並非所有儲存引擎都支援此操作)。
  • TRUNCATE 不是事務安全也不是鎖定安全。
  • DELETE 會告知您刪除了多少行,但 TRUNCATE 不會。
  • 在刪除大量行(約 30%)後,OPTIMIZE TABLE 命令應該使後續語句更快。
  • 對於具有 FOREIGN KEY 約束的 InnoDB 表,TRUNCATE 的行為類似於 DELETE。
 DELETE FROM `antiques`
   WHERE item = 'Ottoman'
   ORDER BY `id`
   LIMIT 1

您可以在刪除行之前對行進行排序,然後只刪除給定數量的行。

參考資料

[編輯 | 編輯原始碼]
華夏公益教科書