插入数据
语法一:
INSERT INTO <表名> [(<字段列表>)] VALUES (<字段列表对应的值>),[(<字段列表对应的值>)]
未指定字段列表时,默认为表的所有字段,对应的值的顺序应该与数据表中字段定义的顺序相同
指定字段列表时,不在字段列表中的字段,将填充数据表定义时定义的默认值,如果没有默认值则为
null
未指定字段列表,或者指定了字段列表但自增列不在字段列表中,或者指定了字段列表且自增列在字段列表中,并且其对应的值定义为
null
,以上三种情况,系统都会自动为该字段插入唯一的自增编号
语法二:
INSERT INTO <表名> SET <字段名> = <字段值>[,<字段名> = <字段值>...]
语法三:
INSERT INTO <表1> [<字段列表>] SELECT <字段列表> FROM <表2> WHERE <筛选条件>
表1和表2的字段列表的字段个数相同、对应位置的数据类型相同,但名称不必相同,根据列的位置进行插入
特殊的插入
表存在主键或者唯一约束,将要插入的行与数据库中已有数据重复时,正常的插入操作将会报错,导致插入失败。
忽略重复,不插入
INSERT IGNORE INTO
有重复记录时,受影响的行数为 0,不会报错
无重复记录时正常插入
不插入,改为更新指定字段
INSERT INTO ... ON DUPLICATE KEY UPDATE <字段名> = <字段值>[,<字段名> = <字段值>...]
有重复记录时,改为更新,
UPDATE
后指定要更新的字段,未指定的字段保持不变受影响的行数为 2,表的
auto_increment
值也+1
,后台执行过程类似:复制旧数据为新行,然后又更新新数据,并删除旧数据无重复记录时正常插入。
先删除旧数据行,再插入新行
REPLACE INTO ...
有重复记录时,先删除旧数据行,再插入新行
受影响行数为 2,且插入新行时未指定的字段将会为
null
,而不会保留旧数据无重复记录时正常插入。
更新数据
UPDATE <表名> SET <字段名> = <字段值>[,<字段名> = <字段值>...] [WHERE <筛选条件表达式>]
表名可以指定多个,实现连表筛选与更新
WHERE
子句只会匹配表达式的结果不为 0 和 null
的行,如果省略 WHERE
子句则匹配所有行
删除数据
DELETE [<要删除数据的表>] FROM <表名> [WHERE <筛选条件表达式>]
FROM
后的表名可以指定多个,实现连表筛选
DELETE
后指定要删除数据的表,单表筛选时可以省略
WHERE
子句只会匹配表达式的结果不为 0 和 null
的行,如果省略 WHERE
子句则匹配所有行
清空数据
TRUNCATE <表名>
只能单表。此指令属于 SQL 定义语言。