SQL:插入,更新,和删除数据

SQL:插入,更新,和删除数据

插入

INSERT 命令被用于在指定表中插入新的行。该命令有两个版本,第一个版本使用 VALUES 子句来指定插入的值的列表:

INSERT INTO table_name (column_name [, ...]) 
	VALUES (new_value [, ...]);

提供一个表名,随后是列列表和值列表。两个列表的项数必须相同。创建新的行,并且值被记录到各自的列中。列列表中的列可以是任何顺序,但是值列表中的值需要与之对齐。任何在列列表中没有列出的列其值为预定义的默认值:

INSERT INTO parts(name, stock, status) 
	VALUES ('Widget', 17, 'IN STOCK');

当批量导入数据时,在数据集中循环十分常见。一次处理一条语句十分缓慢,因为每个命令将更新表和相关的索引,并确认在下次 INSERT 前数据被切实地写入到了物理磁盘中。这是一个非常长地过程,因为需要执行物理 I/O。

如同其他命令一样,每个 INSERT 命令通常被包含在它自己的事务中。提交和同步这一事务十分昂贵,通常限制插入数量为每秒几十个。为了加速批量插入,通常将 1000 到 10000 条 INSERT 语句归入一个事务之中。将语句归为一组大大加快了插入地整体速度,因为将物理 I/O 推迟到事务结束时一起执行。如果事务执行过程中发生错误,整个事务都将回滚。这对从文件中批量加载数据来说可能是能接受的,但是对于插入实时数据流中数据来说是不能接受的。批量事务能大大加速处理过程,但是也显著提高了从错误中恢复的难度。

第二个版本地 INSERT 允许你使用查询语句定义值。这与 CREATE TABLE…AS SELECT 语句十分相似。这是使用单条语句在表中插入多行的唯一版本。

INSERT INTO table_name (column_name, [...]) 
	SELECT query_statement;

这一 INSERT 语句常用于从一个表中批量拷贝数据到另一个表中。当你需要更新一个表的定义,且你不想丢失数据库中已存在的数据时,这是一个常见操作。旧的表被重命名,新的表被定义,旧表中的数据使用 INSERT INTO…SELECT 语句从旧表中被拷贝到新表中。这一形式也能被用于填充一个临时表,或从一个关联的数据库拷贝数据到另一个数据库中。

所有版本的 INSERT 语句都支持一个可选的冲突解决子句。这一冲突子句确定当 INSERT 与数据库约束有冲突时,应当做些什么。最常见的例子是 INSERT OR REPLACE,当 INSERT 造成 UNIQUE 约束冲突时,如果 REPLACE 冲突解决子句存在,会删除原有行,然后插入新行。

关于 INSERT OR REPLACE 命令,这一类型的命令通常频繁用在事件追踪系统中,事件追踪系统需要一个 “last seen” 时间戳。当事件被处理时,系统要么插入一个新行 (这一类型的事件之前从未见过),要么需要更新现存的记录。虽然 INSERT OR REPLACE 变体看起来很适合这类场景,但是它有一些特殊的限制。最重要的是,该命令本质是一个“插入或替换”而非“插入或更新”。在处理 INSERT 请求前,REPLACE 选项完全删除旧的行,使其较更新列的子集更加低效。为了高效的使用 INSERT OR REPLACE 选项,INSERT 需要能完全完全替换现存的行,而不是简单地更新列的子集。

SQLite INSERT 语法:

在这里插入图片描述

更新

UPDATE 被用于表中已存在的行中的一列或多列分配新的值。命令可以更新多行,但是所有的行必须是相同表中的一部分。基本语法为:

UPDATE table_name SET column_name=new_value [, ...] WHERE expression

命令需要一个表名,紧跟着的是应当分配的列名和列值对。哪一行被更新由条件表达式确定,它测试表中的每一行。最常见的使用该表达式的模式是对每一行检测等价性,例如 PRIMARY KEY 列。

如果 WHERE 表达式对表中的每行的求值都为 false,不会发生实际的更新。

在这里插入图片描述

删除

删除命令被用于从单个表中删除一行或多行。行从表中完全删除:

DELETE FROM table_name WHERE expression;

命令仅需要表名和一个选择行的条件表达式。WHERE 表达式被用于检索需要删除的行,正如 UPDATE 命令中那样。

如果 WHERE 表达式对表中的每一行的求值都为 false,不会有任何实际的删除发生。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值