MySQL/Language/Data manipulation

維基教科書,自由的教學讀本

INSERT[編輯]

 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的值
  • 在大量插入前,你可以禁止keys
  • LOCK表可以加快INSERT.

UPDATE[編輯]

 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).

目前不可能對正在修改的表執行子查詢。例如:

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

性能提示

  • UPDATE的速度依賴於多少個索引被修改。
  • 鎖表後UPDATE多行會更快。

REPLACE[編輯]

REPLACE類似於INSERT,除了如果根據主鍵或者唯一索引,表中有老行與要新加入的行有同樣的主鍵(或唯一索引), 則先刪除這些老行。

IGNORE[編輯]

從MySQL 5.5[1], "INSERT IGNORE" 或 "REPLACE IGNORE" 允許忽略掉主鍵重複錯誤。

DELETE 與 TRUNCATE[編輯]

 DELETE [QUICK] FROM `table1`
 TRUNCATE [TABLE] `table1`
  • 如果不用WHERE子句,則DELETE刪除所有行。
  • 大表可能很慢,特別是有很多index時。
  • 如果表有很多索引,增大cache會使DELETE更快(key_buffer_size變量)
  • TRUNCATE實際上做DROP然後CREATE table。
  • TRUNCATE不是事務安全,也不是鎖安全。
  • DELETE會告訴你多少行刪除;而TRUNCATE不會
  • DELET 30%以上的行之後, 應該緊接着OPTIMIZE TABLE
  • InnoDB錶帶FOREIGN KEY約束, TRUNCATE同義DELETE.
 DELETE FROM `antiques`
   WHERE item = 'Ottoman'
   ORDER BY `id`
   LIMIT 1

刪除前先排序,可以只刪除給定的行。

參考文獻[編輯]