SQL的INSERT语句有多种使用场景,以下是一些常见的场景及详细说明:
1. 插入单行数据
INSERT语句最常见的用法是向数据库表中插入单行数据。这种场景适用于需要一次性插入少量数据的情况。例如,当你有一个用户注册表,需要将新用户的信息插入到该表中。
示例:
INSERT INTO users (id, name, email) VALUES (1, 'John', 'john@example.com');
上述示例中,我们向名为users的表中插入了一条新的用户记录。
2. 批量插入数据
有时候需要向数据库表中一次性插入大量数据,这时可以使用批量插入的方式,以提高插入的效率。这种场景适用于需要一次性插入多条记录的情况。例如,当你有一个CSV文件,需要将文件中的数据批量插入到数据库表中。
示例:
INSERT INTO products (id, name, price) VALUES
(1, 'Product 1', 10),
(2, 'Product 2', 20),
(3, 'Product 3', 30);
上述示例中,我们一次性插入了三条产品记录到名为products的表中。
3. 插入查询结果
有时候需要将一个查询的结果插入到另一个表中。这种场景适用于需要将查询结果作为新的数据插入到目标表中的情况。例如,当你需要将某个表的部分数据复制到另一个表中。
示例:
INSERT INTO new_table (id, name)
SELECT id, name FROM old_table WHERE condition;
上述示例中,我们将满足某个条件的old_table表中的id和name列的数据插入到名为new_table的表中。
4. 插入默认值
有时候需要将默认值插入到数据库表中的某些列中。这种场景适用于需要在插入数据时,某些列使用默认值的情况。例如,当你有一个带有创建时间和状态的表,需要在插入数据时,自动填充创建时间并设置默认的状态。
示例:
INSERT INTO orders (id, order_date, status) VALUES (1, DEFAULT, DEFAULT);
上述示例中,我们向名为orders的表中插入一条订单记录,其中order_date和status列使用了默认值。
通过INSERT语句的不同用法,可以满足不同的数据插入需求。
5. 通过临时表的方式插入
DELIMITER //
CREATE PROCEDURE generate_data()
BEGIN
DECLARE i INT DEFAULT 1; -- 定义一个变量i,初始值为1
DECLARE random_apply_no VARCHAR(50); -- 定义一个变量random_apply_no,用于存储生成的随机申请号
DECLARE user_base_values INT; -- 定义一个变量user_base_values,用于存储生成的user_base表的插入数据
DECLARE user_bank_card_values INT; -- 定义一个变量user_bank_card_values,用于存储生成的user_bank_card表的插入数据
WHILE i <= 10000 DO -- 循环,从1到10000
SET random_apply_no = CONCAT('APPLY_', LPAD(i, 4, '0')); -- 生成随机申请号,格式为'APPLY_0001','APPLY_0002'等
-- 生成插入数据的SELECT子句,将生成的值存储到对应的变量中
SET user_base_values = (
SELECT
i,
random_apply_no,
CURDATE(),
CONCAT('CAR_', LPAD(i, 4, '0')),
NOW(),
random_apply_no,
MD5(CONCAT('ID_', LPAD(i, 4, '0'))),
CONCAT('ID_', LPAD(i, 4, '0')),
'IDENTITY',
NOW(),
CONCAT('PHONE_', LPAD(i, 4, '0')),
'WS10043190001',
NULL,
IF(i % 2 = 0, 'MALE', 'FEMALE'),
CONCAT('USER_', LPAD(i, 4, '0')),
CONCAT('USER_', LPAD(i, 4, '0')),
NULL
);
SET user_bank_card_values = (
SELECT
i,
CONCAT('USER_', LPAD(i, 4, '0')),
CONCAT('ID_', LPAD(i, 4, '0')),
CONCAT('BANK_', LPAD(i, 4, '0')),
CONCAT('BANK_CODE_', LPAD(i, 4, '0')),
CONCAT('BANK_CARD_', LPAD(i, 4, '0')),
CONCAT('PHONE_', LPAD(i, 4, '0')),
NULL,
NOW(),
NOW(),
'WS10043190001',
random_apply_no,
CONCAT('AGREEMENT_', LPAD(i, 4, '0')),
random_apply_no,
CONCAT('ACCOUNT_', LPAD(i, 4, '0')),
1,
CONCAT('REQ_', LPAD(i, 4, '0'))
);
-- 在user_base表中插入数据,通过临时表的方式插入
INSERT INTO user_base
SELECT * FROM (SELECT user_base_values) AS temp
WHERE i = user_base_values;
-- 在user_bank_card表中插入数据,通过临时表的方式插入
INSERT INTO user_bank_card
SELECT * FROM (SELECT user_bank_card_values) AS temp
WHERE i = user_bank_card_values;
SET i = i + 1; -- i递增
END WHILE;
END //
DELIMITER ;