MySQL/Language/Data manipulation
外觀
< MySQL
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
刪除前先排序,可以只刪除給定的行。