目录
10、INSERT INTO ... ON DUPLICATE KEY UPDATE
在SQL中,你可以使用INSERT INTO
语句来添加数据到数据库表中。以下是一些基本的例子来说明如何操作。
1、插入完整的行数据
如果你想要插入一行的所有数据,你需要为表中的每一列都提供一个值。语法如下:
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES (值1, 值2, 值3, ...);
假设我们有一个名为students
的表,它包含id
, name
, 和age
三个列。
CREATE TABLE students (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT
);
例如,假设你有一个名为students
的表,它有id
, name
, 和 age
三列。你可以这样插入一行数据:
INSERT INTO students (id, name, age)
VALUES (1, '张三', 20);
2、 插入指定列的数据
如果你只想为表中的某些列插入数据,你可以省略其他列。这种情况下,你不需要在INSERT INTO
语句中列出所有的列名,只需要列出你想要插入数据的列名即可。
INSERT INTO 表名 (列1, 列2, 列3, ...)
VALUES (值1, 值2, 值3, ...);
使用上面的students
表为例,假设我们只想插入name
和age
,可以这样写:
INSERT INTO students (name, age)
VALUES ('李四', 22);
在这种情况下,id
列的值可能会由数据库自动填充(例如,如果id
是一个自增列)。
3. 插入多行数据
在某些数据库中(如MySQL),你可以一次插入多行数据。语法如下:
INSERT INTO 表名 (列1, 列2, ...)
VALUES
(值1a, 值2a, ...),
(值1b, 值2b, ...),
...;
例如:
INSERT INTO students (name, age)
VALUES
('王五', 21),
('赵六', 23);
注意:不是所有的数据库系统都支持一次插入多行数据。在使用前,请确保你的数据库系统支持此功能。
4. 省略列名
如果你为表中的所有列都提供了值,并且这些值的顺序与表中的列顺序相匹配,那么你可以省略列名:
INSERT INTO students
VALUES (4, '赵六', 22);
这条语句的效果与之前的示例相同。但是,为了代码的可读性和维护性,通常建议明确指定列名。
5. 插入默认值或NULL值
如果表的某列有默认值,并且你在INSERT INTO
语句中没有为该列提供值,那么它将使用默认值。如果某列允许NULL值,并且你没有提供值,那么它将插入NULL。
例如,如果age
列有默认值18
,你可以这样插入数据:
INSERT INTO students (id, name)
VALUES (5, '孙七');
在这种情况下,age
列将被设置为默认值18
。
6、INSERT INTO ... SELECT
这种语句允许你从另一个表或查询结果中插入数据。
INSERT INTO target_table (column1, column2, ...)
SELECT columnA, columnB, ...
FROM source_table
WHERE condition;
例如,你可以从一个表复制数据到另一个具有相同结构的表:
INSERT INTO students_backup (id, name, age)
SELECT id, name, age
FROM students;
7、INSERT OVERWRITE
这个语句在某些数据库管理系统(如Hive)中可用,用于覆盖目标表中的数据。它通常与分区表一起使用,以替换特定分区的数据。
8、INSERT IGNORE INTO
这个语句在插入数据时,如果主键或唯一索引的值已存在,它会忽略这次插入操作,而不会引发错误。这可以用来避免插入重复数据。
INSERT IGNORE INTO students (id, name, age)
VALUES (1, '张三', 20);
如果id
为1的记录已经存在,这条语句将不会有任何效果。
9、REPLACE INTO
这个语句在插入数据时,如果主键或唯一索引的值已存在,它会先删除旧记录,然后插入新记录。这可以用来更新已存在的记录。
REPLACE INTO students (id, name, age)
VALUES (1, '张三', 21);
如果id
为1的记录已经存在,这条语句会先删除那条记录,然后插入新的记录。
10、INSERT INTO ... ON DUPLICATE KEY UPDATE
这个语句在MySQL中特别有用。当尝试插入一个与现有记录具有相同主键或唯一索引的记录时,它会更新现有记录而不是插入新记录。
INSERT INTO students (id, name, age)
VALUES (1, '张三', 25)
ON DUPLICATE KEY UPDATE
age = VALUES(age);
如果id
为1的记录已经存在,这条语句会更新那条记录的age
字段为25。
11、使用子查询插入
你可以在INSERT INTO
语句中使用子查询来动态生成要插入的数据。
INSERT INTO summary_table (total_students)
SELECT COUNT(*) FROM students;
选择使用哪种插入语句取决于你的具体需求,例如是否需要更新现有记录、是否需要避免重复数据、以及你的数据库管理系统支持哪些特性。在编写插入语句时,务必注意数据类型匹配、约束条件(如主键和唯一索引)以及可能的性能影响。