insert,update,delete,truncate语句。
1、insert
格式:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] [[database_name.]owner.]table_name
[(column1[, ...])]
[PARTITION (partition_name[, partition_name] ...)]
{VALUES | VALUE ( [ROW] {value1 | DEFAULT}[, ...] ) [, [ROW](,...)] |
(select_statement SET [ON DUPLICATE KEY UPDATE]
column1=value1, column2=value2[, ...]})
说明:
LOW_PRIORITY | DELAYED | HIGH PRIORITY: 低优先级, 当没有任何客户端读取该表时,才选择插入,可能会导致很长的延迟。DELAYED,相当于异步执行,允许客户端继续执行其他脚本无需等待insert结束。HIGH PRIORITY,取消低优先级带来的影响,本身不会提高性能。
IGNORE: 忽略非致命性的错误,例如插入重复的行。
into [[database_name.]owner.]table_name: 数据库的名称,用户的名称,表的名称,前两者可以忽略。
VALUES | VALUE ( [ROW] {value1 | DEFAULT}[, ...] ) [, [ROW](,...)]: values插入多条, value插入一条, default设置默认值。
select_statement:查询语句, 与values | value为互斥关系。
set column1 = val1, column2= val2: 与select_statement, values互斥,直接设置字符串常量。
on duplicate key update (column1=value1): 当主键冲突时,执行更新操作。
示例:
insert into learn_alter set id=62, name='王五', log_date ='2023-01-01' on duplicate key update name='孙刘';
失败场景:
- 插入值与列的数据类型不匹配,且无法转换。
- 插入值超出列的最大长度
- 值的数量与列值不匹配。
- 在非null列中插入null值。
- 违背唯一性约束,主键约束,check约束等其他约束。
2、update
格式:
UPDATE [LOW PRIORITY] [IGNORE] table_references
SET [table_alias.]column_name = {scalar_expression} [, ...]
WHERE search_conditions
[ORDER BY column_name1 [{ASC | DESC}][, ...]]
[LIMIT int]
说明:
low priority与ignore与delete语句中的含义完全相同,略。在使用更新语句之前,最好先查询一下所更新的数据。
3、delete
格式:
DELETE [LOW_PRIORITY] [QUICK][IGNORE] [table_name[.*][, ...]]
{FROM table_name[.*][, ...] | [USING table_name[.*][, ...]]}
[PARTITION (partition_name[, ...])]
[WHERE search_condition]
[ORDER BY clause]
[LIMIT nbr_of_rows]
说明:
low_priority: 延迟delete的操作,直到没有任何客户端读取该表
quick: 快速删除,在删除过程中忽略索引中的相关操作。这会导致删除之后,索引中的数据与表数据不一致,除非大量删除,重新创建索引时使用此项。
ignore: 在删除过程中,忽略非致命性的错误,例如外键关联。
from table_name using table_names: from语句指定被删除的表,using语句指定关联的表, delete中的where语句也可以使用关联.
table_name from table_names: table_name指定被删除的表,table_names指定关联的表。
order by clause: 指定排序,只有当存在limit语句时才有意义。
limit number of rows:指定删除的条数。
示例:
delete orders from customers, orders where customers.id = orders.customer_id and orders.date between ‘2020-01-01’ and ‘2020-12-31’;
delete from orders where statement order by statement limit N, 任意的where条件, 排序方式,条数。
4、truncate
格式:
TRUNCATE TABLE table_name [CONTINUE IDENTITY | RESTART IDENTITY]
continue或restart表示若表中有自增列时,重置为起始值。Mysql中truncate table等价于truncate table restart identity,不支持continue选项。
注意事项:
- truncate操作记录少量的redo日志,占用较少的空间。因为没有日志,所以无法回滚。
- 不会激活触发器
- 当表被锁时,会导致失败。