向已有的表中插入新行
INSERT INTO <表名> (<列1>[, <列2> ...])
VALUES
(<行1值1>[, <行1值2> ...]),
[(<行2值1>, <行1值2> ...),]
...
Note
|
在使用 |
INSERT 基本语法
/*
创建一个表,并向其中写入两行数据
*/
CREATE TABLE mytable (
id INTEGER PRIMARY KEY,
name TEXT,
'phone number' INTEGER,
address TEXT
);
-- 如上说所,向表中插入新行不需要指定所有的字段
-- 比如这里就忽略了电话号码和地址,在插入行时,SQLite 会自动填充 NULL 到未指定的列中
INSERT INTO mytable (id, name)
VALUES
(1, 'alice'),
(2, 'bob');
若要以全默认值插入一行,可以这样写
INSERT INTO <表名> DEFAULT VALUE;
INSERT
可以与 SELECT
连用,这样就可以把查询到的数据插入另一个表中
-- 注意,若 SELECT 的键名刚好与 INSERT 的列名相同,
-- 那么 INSERT INTO 可以不写列名
INSERT INTO <要修改的表> (<列名1>, <列名2>)
SELECT ...
INSERT 与 SELECT 连用
/*
创建一个 mytable 的备份表
*/
-- 创建备份表
CREATE TABLE mytable_bk (
id INTEGER PRIMARY KEY,
name TEXT,
'phone number' INTEGER,
address TEXT
);
-- 把 mytable 的数据完全导入至 mytable_bk 中
-- 由于 mytable 的列名与 mytable_bk 的完全相同,
-- 这里忽略了 INSERT INTO 后面的列名
INSERT INTO mytable_bk
SELECT * FROM mytable;
更新一个表中的行
UPDATE 基础语法
/*
注意,仅使用 UPDATE 会修改整个表中所有行对应的数据
*/
UPDATE <表名>
SET
<列1> = <新值1>,
[<列2> = <新值2>,]
...;
由于上面的语法会修改整个表指定的列的所有的数据,
因此单纯使用 UPDATE
几乎是没有什么用的,
一般来说,UPDATE
至少会搭配 WHERE
来使用
UPDATE <表名1>
SET
<列1> = <新值1>,
[<列2> = <新值2>,]
...
WHERE
<行筛选条件>;
修改单列信息
-- 修改雇员表中 employeeid 为 3 的行的 lastname 修改为 'Smith'
UPDATE employees
SET lastname = 'Smith'
WHERE employeeid = 3;
修改多列信息
-- 更新雇员表中 employeeid 为 4 的行的地址信息
UPDATE employees
SET
city = 'Toronto',
state = 'ON',
postalcode = 'M5P 2N7'
WHERE
employeeid = 4;
在修改中使用变量
-- 将所有员工的邮件地址设置为全名的形式
-- 下方 SET 语句中,虽然我们仅指出了列名,
-- 但是实际上 SQLite 会自动为每一行替换对应的内容
UPDATE employees
SET email = LOWER(
firstname || "." || lastname || "@chinookcorp.com"
)
REPLACE 其实是 INSERT 的一个变种,REPLACE 的全称应该为 INSERT OR REPLACE
。
所以 REPLACE 应该满足 INSERT 的语法。与 INSERT 的不同的地方在于:
若 REPLACE 的列具有 UNIQUE
或 PRIMARY KEY
约束,且新的数据的该列与旧数据的该列相同,
则移除旧行,再插入新行(REPLACE 的语义是如此)。
特别注意的是,若新的数据不满足约束,那么不会插入新行,而删除旧行的操作也会回滚。
CREATE TABLE IF NOT EXIST positions(
id INTERGER PRIMARY KEY, -- 注意这里的 PRIMARY KEY 约束
title TEXT NOT NULL UNIQUE, -- 以及这里的 UNIQUE 约束
min_salary NUMERIC
);
INSERT INTO positions
(title, min_salary)
VALUES
('DBA', 120000),
('Developer', 100000),
('Architect', 150000);