【MySQL】数据表插入数据

在这里插入图片描述

个人主页:Guiat
归属专栏:MySQL

在这里插入图片描述

文章目录

  • 1. 插入数据概述
    • 1.1 插入数据的重要性
    • 1.2 插入数据的基本原则
  • 2. 基本插入语句
    • 2.1 INSERT INTO语法
    • 2.2 插入多行数据
    • 2.3 不指定列名的插入
    • 2.4 插入NULL和默认值
  • 3. 高级插入技术
    • 3.1 使用子查询插入数据
    • 3.2 IGNORE关键字
    • 3.3 ON DUPLICATE KEY UPDATE
    • 3.4 REPLACE语句
    • 3.5 使用INTO OUTFILE和FROM INFILE
  • 4. 批量插入优化
    • 4.1 多值插入的性能优势
    • 4.2 批量插入策略
    • 4.3 使用事务提高批量插入性能
    • 4.4 禁用约束和索引以加速大规模导入
    • 4.5 使用LOAD DATA INFILE进行超大数据集导入
  • 5. 特殊数据类型的插入
    • 5.1 插入日期和时间
    • 5.2 插入JSON数据
    • 5.3 插入二进制数据(BLOB)
    • 5.4 插入地理空间数据
  • 6. 处理错误和数据验证
    • 6.1 错误处理策略
    • 6.2 使用事务进行错误控制
    • 6.3 预验证和数据清洗
    • 6.4 使用INSERT ... SELECT时的数据验证
  • 7. 实际应用示例
    • 7.1 电子商务数据库数据插入
    • 7.2 博客系统数据插入
    • 7.3 日志系统数据导入
  • 8. 批量导入数据分析
    • 8.1 性能比较
    • 8.2 不同数据量的最佳实践
    • 8.3 插入性能优化策略
  • 9. 安全考虑
    • 9.1 预防SQL注入
    • 9.2 适当的权限控制
    • 9.3 输入数据验证和清洗
  • 10. 高级用例和技巧
    • 10.1 使用导入工具
    • 10.2 使用存储过程自动化数据插入
    • 10.3 使用触发器验证插入数据

正文

1. 插入数据概述

插入数据是数据库操作中最基本的操作之一,MySQL提供了多种插入数据的方式,以满足不同的使用场景和需求。

1.1 插入数据的重要性

  • 是数据库操作的基础
  • 决定数据库中存储的内容质量
  • 影响后续查询、更新和分析操作
  • 是数据初始化和数据迁移的关键步骤

1.2 插入数据的基本原则

  • 确保数据符合表的结构和约束
  • 遵循数据类型的要求
  • 特殊字符应该正确转义
  • 大批量数据应考虑性能优化
  • 插入操作应该考虑事务管理
  • 注意数据格式和编码的一致性

2. 基本插入语句

2.1 INSERT INTO语法

-- 基本语法
INSERT INTO table_name (column1, column2, column3,...)
VALUES (value1, value2, value3,...);-- 实例:插入完整行数据,指定所有列
INSERT INTO customers (customer_id, first_name, last_name, email, phone)
VALUES (1, 'John', 'Doe', 'john.doe@example.com', '555-123-4567');-- 实例:只插入部分列,其他列使用默认值或NULL
INSERT INTO products (product_name, price, category_id)
VALUES ('Smartphone', 699.99, 3);

2.2 插入多行数据

-- 一次性插入多行数据
INSERT INTO employees (first_name, last_name, department, salary)
VALUES ('Alice', 'Johnson', 'HR', 55000),('Bob', 'Smith', 'IT', 65000),('Carol', 'Williams', 'Finance', 60000),('David', 'Brown', 'Marketing', 50000);-- 带条件的多行插入
INSERT INTO sales (product_id, quantity, sale_date, amount)
VALUES(101, 5, '2023-01-15', 250.00),(102, 3, '2023-01-15', 120.00),(103, 8, '2023-01-16', 400.00);

2.3 不指定列名的插入

-- 不指定列名,按表的列顺序插入(不推荐,易出错)
INSERT INTO countries
VALUES (1, 'USA', 'United States', 'North America');-- 当表结构变化时,上面的查询可能会出错,
-- 而下面的查询会更加健壮
INSERT INTO countries (country_id, code, name, continent)
VALUES (1, 'USA', 'United States', 'North America');

2.4 插入NULL和默认值

-- 显式插入NULL值
INSERT INTO orders (order_id, customer_id, total_amount, notes)
VALUES (1001, 5, 125.50, NULL);-- 隐式插入NULL (省略列)
INSERT INTO orders (order_id, customer_id, total_amount)
VALUES (1002, 6, 230.75);-- 使用DEFAULT关键字插入默认值
INSERT INTO articles (title, content, published)
VALUES ('New Article', 'This is the content', DEFAULT);-- 省略有默认值的列
INSERT INTO articles (title, content)
VALUES ('Another Article', 'More content here');

3. 高级插入技术

3.1 使用子查询插入数据

-- 使用子查询的插入语法
INSERT INTO table_name (column1, column2, ...)
SELECT column1, column2, ...
FROM source_table
WHERE condition;-- 实例:从临时用户表插入新客户
INSERT INTO customers (first_name, last_name, email, phone)
SELECT first_name, last_name, email, phone
FROM temp_users
WHERE verified = TRUE;-- 实例:使用计算结果插入数据
INSERT INTO product_stats (product_id, total_sales, average_rating)
SELECT product_id,SUM(quantity * price) AS total_sales,AVG(rating) AS average_rating
FROM sales
JOIN product_reviews USING (product_id)
GROUP BY product_id;

3.2 IGNORE关键字

-- 使用IGNORE关键字忽略错误
INSERT IGNORE INTO users (username, email)
VALUES ('user1', 'user1@example.com'),('user2', 'user2@example.com');-- 如果出现违反唯一约束等错误,操作将继续进行
-- 会忽略引起错误的行,而不是整个语句失败

3.3 ON DUPLICATE KEY UPDATE

-- 遇到重复键时更新数据
INSERT INTO products (product_id, product_name, price, stock)
VALUES (101, 'Tablet Pro', 499.99, 50)
ON DUPLICATE KEY UPDATE price = VALUES(price),stock = stock + VALUES(stock);-- 使用表达式更新
INSERT INTO daily_stats (date, page_views, unique_visitors)
VALUES (CURRENT_DATE, 1500, 750)
ON DUPLICATE KEY UPDATE page_views = page_views + VALUES(page_views),unique_visitors = unique_visitors + VALUES(unique_visitors);

3.4 REPLACE语句

-- 使用REPLACE代替INSERT
REPLACE INTO contacts (contact_id, name, email, phone)
VALUES (25, 'Jane Smith', 'jane.smith@example.com', '555-987-6543');-- REPLACE的工作原理:
-- 1. 如果新行不违反PRIMARY KEY或UNIQUE索引,与INSERT一样插入
-- 2. 如果新行违反约束,先删除旧行,再插入新行

3.5 使用INTO OUTFILE和FROM INFILE

-- 导出数据到文件
SELECT * FROM customers
INTO OUTFILE '/tmp/customers.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';-- 从文件导入数据
LOAD DATA INFILE '/tmp/customers.csv'
INTO TABLE customers
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';-- 使用LOCAL关键字从客户端加载文件
LOAD DATA LOCAL INFILE '/path/on/client/data.csv'
INTO TABLE imported_data
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES; -- 忽略标题行

4. 批量插入优化

4.1 多值插入的性能优势

-- 单条插入(低效)
INSERT INTO log_entries (user_id, action, timestamp)
VALUES (101, 'login', NOW());INSERT INTO log_entries (user_id, action, timestamp)
VALUES (102, 'logout', NOW());-- 多值插入(高效)
INSERT INTO log_entries (user_id, action, timestamp)
VALUES (101, 'login', NOW()),(102, 'logout', NOW()),(103, 'update', NOW()),(104, 'delete', NOW());

多值插入的优势:

  • 减少网络往返次数
  • 减少事务和锁开销
  • 减少日志写入次数
  • 提高整体插入性能

4.2 批量插入策略

-- 创建临时表导入数据,然后合并
CREATE TEMPORARY TABLE temp_import (id INT PRIMARY KEY,name VARCHAR(100),value DECIMAL(10,2)
);-- 向临时表导入大量数据
INSERT INTO temp_import VALUES ...;-- 将数据从临时表合并到主表
INSERT INTO main_table (id, name, value)
SELECT id, name, value FROM temp_import
ON DUPLICATE KEY UPDATEname = VALUES(name),value = VALUES(value);

4.3 使用事务提高批量插入性能

-- 开始事务
START TRANSACTION;-- 批量插入多条数据
INSERT INTO orders (customer_id, order_date, total)
VALUES (101, '2023-03-10', 299.99),(102, '2023-03-10', 149.50),-- ... 可以有成百上千条(250, '2023-03-11', 1045.75);-- 提交事务
COMMIT;

4.4 禁用约束和索引以加速大规模导入

-- 临时禁用外键检查
SET FOREIGN_KEY_CHECKS = 0;-- 执行大规模插入
INSERT INTO large_table VALUES ...;-- 重新启用外键检查
SET FOREIGN_KEY_CHECKS = 1;-- 禁用唯一键检查
SET UNIQUE_CHECKS = 0;-- 执行大规模插入
INSERT INTO large_table VALUES ...;-- 重新启用唯一键检查
SET UNIQUE_CHECKS = 1;

4.5 使用LOAD DATA INFILE进行超大数据集导入

-- 使用LOAD DATA INFILE进行高性能导入
LOAD DATA INFILE '/var/lib/mysql-files/huge_dataset.csv'
INTO TABLE massive_data
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
(col1, col2, @date_var, col4)
SET created_at = STR_TO_DATE(@date_var, '%Y-%m-%d');

LOAD DATA INFILE优势:

  • 直接从服务器文件系统读取,减少网络开销
  • 批量处理,减少解析开销
  • 支持数据转换和预处理
  • 可以是普通INSERT速度的20倍或更高

5. 特殊数据类型的插入

5.1 插入日期和时间

-- 插入显式日期和时间值
INSERT INTO events (event_name, event_date, start_time, end_time)
VALUES ('Conference', '2023-05-15', '09:00:00', '17:00:00');-- 使用函数插入当前日期和时间
INSERT INTO log_entries (action, created_at, updated_at)
VALUES ('system_check', NOW(), NOW());-- 使用不同函数插入日期和时间
INSERT INTO records (created_date,created_time,created_datetime,created_timestamp
)
VALUES (CURRENT_DATE(),CURRENT_TIME(),NOW(),CURRENT_TIMESTAMP()
);-- 插入带有时区的时间
INSERT INTO global_events (event_name, event_time, time_zone)
VALUES ('Global Conference', '2023-05-20 14:30:00', 'UTC');

5.2 插入JSON数据

-- 插入JSON对象
INSERT INTO user_preferences (user_id, preferences)
VALUES (101, '{"theme": "dark", "notifications": true, "sidebar": "left"}');-- 插入JSON数组
INSERT INTO product_tags (product_id, tags)
VALUES (1001, '["electronics", "sale", "featured", "new"]');-- 使用JSON函数构建JSON数据
INSERT INTO document_store (doc_id, content)
VALUES (1, JSON_OBJECT('title', 'Annual Report','year', 2023,'authors', JSON_ARRAY('John Smith', 'Jane Doe'),'metadata', JSON_OBJECT('version', 1.5, 'status', 'draft'))
);

5.3 插入二进制数据(BLOB)

-- 插入十六进制字符串作为二进制数据
INSERT INTO files (file_name, file_data)
VALUES ('logo.png', UNHEX('89504E470D0A1A0A'));-- 使用LOAD_FILE函数(需要MySQL有文件读取权限)
INSERT INTO images (image_name, image_data)
VALUES ('profile.jpg', LOAD_FILE('/var/www/images/profile.jpg'));-- 在编程语言中使用参数化查询插入BLOB数据
-- 以PHP为例:
/*
$stmt = $pdo->prepare("INSERT INTO documents (doc_name, doc_data) VALUES (?, ?)");
$stmt->bindParam(1, $fileName);
$stmt->bindParam(2, $fileData, PDO::PARAM_LOB);
$stmt->execute();
*/

5.4 插入地理空间数据

-- 插入点数据
INSERT INTO locations (name, position)
VALUES ('Store A', ST_GeomFromText('POINT(40.7128 -74.0060)'));-- 插入线数据
INSERT INTO routes (route_name, path)
VALUES ('Route 1', ST_GeomFromText('LINESTRING(0 0, 1 1, 2 2)'));-- 插入多边形数据
INSERT INTO territories (territory_name, boundary)
VALUES ('Territory A', ST_GeomFromText('POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))')
);

6. 处理错误和数据验证

6.1 错误处理策略

-- 使用IGNORE忽略错误继续执行
INSERT IGNORE INTO users (username, email)
VALUES ('john', 'john@example.com'),('john', 'john_duplicate@example.com'); -- 会忽略这一行的错误-- 使用INSERT ... ON DUPLICATE KEY UPDATE
INSERT INTO page_views (page_id, views)
VALUES (101, 1)
ON DUPLICATE KEY UPDATE views = views + 1;-- 使用REPLACE替换现有记录
REPLACE INTO contacts (contact_id, name, email)
VALUES (1, 'John Doe', 'john.updated@example.com');

6.2 使用事务进行错误控制

-- 使用事务确保数据一致性
START TRANSACTION;-- 插入订单
INSERT INTO orders (order_id, customer_id, total_amount)
VALUES (12345, 101, 456.78);-- 插入订单项
INSERT INTO order_items (order_id, product_id, quantity, price)
VALUES (12345, 201, 2, 150.00),(12345, 202, 1, 156.78);-- 如果一切正常,提交事务
COMMIT;-- 如果有错误,回滚
-- ROLLBACK;

6.3 预验证和数据清洗

-- 在插入前检查和验证数据
SELECT @invalid_emails := COUNT(*) 
FROM temp_import 
WHERE email NOT LIKE '%@%.%';-- 如果有无效数据,可以清理或报错
SELECT IF(@invalid_emails > 0,SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid email addresses detected','Data validation passed'
) AS validation_result;-- 插入前清理数据
INSERT INTO customers (first_name, last_name, email)
SELECT TRIM(first_name),TRIM(last_name),LOWER(TRIM(email))
FROM temp_customers
WHERE email LIKE '%@%.%';

6.4 使用INSERT … SELECT时的数据验证

-- 使用HAVING子句过滤无效数据
INSERT INTO verified_sales (product_id, year, total_sales)
SELECT product_id,YEAR(sale_date) AS year,SUM(amount) AS total_sales
FROM sales
GROUP BY product_id, YEAR(sale_date)
HAVING COUNT(*) >= 5 -- 只导入有至少5笔销售记录的产品
AND total_sales > 1000; -- 只导入销售额超过1000的数据

7. 实际应用示例

7.1 电子商务数据库数据插入

-- 插入类别数据
INSERT INTO categories (category_name, description, parent_id) 
VALUES ('Electronics', 'Electronic devices and gadgets', NULL),('Computers', 'Desktop and laptop computers', 1),('Smartphones', 'Mobile phones and accessories', 1),('Clothing', 'Apparel and fashion items', NULL),('Men\'s Clothing', 'Clothing for men', 4),('Women\'s Clothing', 'Clothing for women', 4);-- 插入产品数据
INSERT INTO products (product_name, category_id, price, stock_quantity, description)
VALUES ('Gaming Laptop Pro', 2, 1299.99, 25, 'High-performance gaming laptop with the latest GPU'),('Smartphone X', 3, 799.99, 50, 'Latest smartphone with advanced camera features'),('Men\'s Casual Shirt', 5, 39.99, 100, 'Comfortable cotton shirt for casual wear'),('Women\'s Summer Dress', 6, 59.99, 75, 'Light and stylish summer dress');-- 插入客户数据
INSERT INTO customers (first_name, last_name, email, phone, address)
VALUES ('John', 'Doe', 'john.doe@example.com', '555-123-4567', '123 Main St, Anytown, USA'),('Jane', 'Smith', 'jane.smith@example.com', '555-987-6543', '456 Oak Ave, Othertown, USA');-- 插入订单数据
INSERT INTO orders (customer_id, order_date, status, shipping_address, total_amount)
VALUES (1, NOW(), 'processing', '123 Main St, Anytown, USA', 1339.98);-- 插入订单项目数据
INSERT INTO order_items (order_id, product_id, quantity, unit_price)
VALUES (1, 1, 1, 1299.99),(1, 3, 1, 39.99);-- 更新产品库存
UPDATE products 
SET stock_quantity = stock_quantity - 1
WHERE product_id IN (1, 3);

7.2 博客系统数据插入

-- 插入用户数据
INSERT INTO users (username, email, password_hash, display_name, bio, registration_date) 
VALUES ('admin', 'admin@blog.com', SHA2('secure_password', 256), 'Admin User', 'Blog administrator', NOW()),('author1', 'author1@blog.com', SHA2('author_password', 256), 'First Author', 'Professional blogger', NOW());-- 插入分类数据
INSERT INTO categories (category_name, slug, description) 
VALUES ('Technology', 'technology', 'Articles about technology'),('Lifestyle', 'lifestyle', 'Lifestyle and personal development'),('Travel', 'travel', 'Travel guides and experiences');-- 插入文章数据
INSERT INTO posts (title, slug, content, author_id, published_date, status, featured_image)
VALUES ('Getting Started with MySQL', 'getting-started-mysql', 'MySQL is a popular relational database management system...',1, NOW(), 'published','/images/mysql-logo.jpg'),('Top 10 Travel Destinations', 'top-travel-destinations', 'Here are the top destinations you should visit this year...',2, NOW(), 'published','/images/travel.jpg');-- 文章与分类关联
INSERT INTO post_categories (post_id, category_id)
VALUES (1, 1), -- MySQL文章关联到Technology分类(2, 3); -- 旅行文章关联到Travel分类-- 插入标签数据
INSERT INTO tags (tag_name, slug) 
VALUES ('MySQL', 'mysql'),('Database', 'database'),('Travel', 'travel'),('Adventure', 'adventure');-- 文章与标签关联
INSERT INTO post_tags (post_id, tag_id)
VALUES (1, 1), -- MySQL文章关联MySQL标签(1, 2), -- MySQL文章关联Database标签(2, 3), -- 旅行文章关联Travel标签(2, 4); -- 旅行文章关联Adventure标签-- 插入评论
INSERT INTO comments (post_id, author_name, author_email, content, created_at, status)
VALUES (1, 'Reader One', 'reader1@example.com', 'Great introduction to MySQL!', NOW(), 'approved'),(1, 'Reader Two', 'reader2@example.com', 'Very helpful tutorial.', NOW(), 'approved'),(2, 'Traveler', 'traveler@example.com', 'I visited destination #3 last year, it was amazing!', NOW(), 'approved');

7.3 日志系统数据导入

-- 创建临时表存储日志
CREATE TEMPORARY TABLE temp_logs (log_timestamp VARCHAR(25),log_level VARCHAR(10),service VARCHAR(50),message TEXT,ip_address VARCHAR(15)
);-- 从CSV文件导入日志数据
LOAD DATA INFILE '/var/log/app/logs.csv'
INTO TABLE temp_logs
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;-- 清理和标准化数据后插入到主日志表
INSERT INTO system_logs (timestamp, log_level, service, message, ip_address, created_date)
SELECT STR_TO_DATE(log_timestamp, '%Y-%m-%d %H:%i:%s'),UPPER(log_level),TRIM(service),message,ip_address,DATE(STR_TO_DATE(log_timestamp, '%Y-%m-%d %H:%i:%s'))
FROM temp_logs
WHERE log_level IN ('error', 'warning', 'info', 'debug');-- 为日志摘要生成统计数据
INSERT INTO log_summary (log_date, total_errors, total_warnings, total_info)
SELECT DATE(timestamp) AS log_date,SUM(IF(log_level = 'ERROR', 1, 0)) AS total_errors,SUM(IF(log_level = 'WARNING', 1, 0)) AS total_warnings,SUM(IF(log_level = 'INFO', 1, 0)) AS total_info
FROM system_logs
GROUP BY DATE(timestamp)
ON DUPLICATE KEY UPDATEtotal_errors = VALUES(total_errors),total_warnings = VALUES(total_warnings),total_info = VALUES(total_info);

8. 批量导入数据分析

8.1 性能比较

不同插入方法的性能比较:

插入方法性能比较
单行INSERT
多行INSERT
LOAD DATA INFILE
INSERT IGNORE
INSERT ... SELECT
性能最低
每行一个网络请求
中等性能
减少网络请求
性能最高
直接文件访问
中高性能
忽略错误减少中断
高性能
服务器内部处理

8.2 不同数据量的最佳实践

数据量建议方法其他优化
少量(<100)标准INSERT单事务处理
中量(100-10K)多行VALUES INSERT适当批量大小(500-1000行/批)
大量(10K-1M)INSERT…SELECT 或批处理禁用索引,使用事务
海量(>1M)LOAD DATA INFILE分区表,临时禁用约束

8.3 插入性能优化策略

-- 1. 使用事务包裹多个INSERT
START TRANSACTION;
-- 多个INSERT语句
COMMIT;-- 2. 临时禁用索引
ALTER TABLE large_table DISABLE KEYS;
-- 批量插入数据
ALTER TABLE large_table ENABLE KEYS;-- 3. 调整MySQL配置参数
-- my.cnf或my.ini中:
-- innodb_buffer_pool_size = 1G
-- innodb_flush_log_at_trx_commit = 0
-- bulk_insert_buffer_size = 256M-- 4. 使用INSERT DELAYED(仅MyISAM表)
-- INSERT DELAYED INTO logs (message) VALUES ('Log entry');-- 5. 使用分区表处理大数据集
CREATE TABLE huge_data (id INT, value INT,log_date DATE
)
PARTITION BY RANGE (TO_DAYS(log_date)) (PARTITION p0 VALUES LESS THAN (TO_DAYS('2023-01-01')),PARTITION p1 VALUES LESS THAN (TO_DAYS('2023-02-01')),PARTITION p2 VALUES LESS THAN (TO_DAYS('2023-03-01')),PARTITION p3 VALUES LESS THAN (MAXVALUE)
);

9. 安全考虑

9.1 预防SQL注入

在编程语言中使用参数化查询,而不是直接拼接SQL:

// 错误示例 (PHP)
// $query = "INSERT INTO users (username, password) VALUES ('$username', '$password')";// 正确示例 (PHP with PDO)
// $stmt = $pdo->prepare("INSERT INTO users (username, password) VALUES (?, ?)");
// $stmt->execute([$username, $password]);

9.2 适当的权限控制

-- 创建只有插入权限的用户
CREATE USER 'app_insert'@'localhost' IDENTIFIED BY 'password';
GRANT INSERT ON database_name.table_name TO 'app_insert'@'localhost';
FLUSH PRIVILEGES;

9.3 输入数据验证和清洗

-- 在插入前验证和清理数据
INSERT INTO user_profiles (user_id, display_name, website)
SELECT user_id,-- 移除危险HTML标签REGEXP_REPLACE(display_name, '<[^>]*script[^>]*>', '[removed]'),-- 确保网址格式正确IF(website REGEXP '^https?://.+', website, NULL)
FROM temp_user_data;

10. 高级用例和技巧

10.1 使用导入工具

# 使用mysqldump导出数据
mysqldump -u username -p database_name table_name > table_dump.sql# 使用mysql命令导入数据
mysql -u username -p database_name < table_dump.sql# 使用mysqlimport导入CSV数据
mysqlimport --local --fields-terminated-by=',' \--columns='column1,column2,column3' \--lines-terminated-by='\n' \database_name /path/to/datafile.csv

10.2 使用存储过程自动化数据插入

-- 创建存储过程生成测试数据
DELIMITER //
CREATE PROCEDURE generate_test_data(IN num_rows INT)
BEGINDECLARE i INT DEFAULT 0;START TRANSACTION;WHILE i < num_rows DOINSERT INTO test_data (name,value,created_at) VALUES (CONCAT('Test Name ', i),RAND() * 1000,DATE_ADD(NOW(), INTERVAL RAND() * 365 DAY));SET i = i + 1;END WHILE;COMMIT;
END //
DELIMITER ;-- 调用存储过程
CALL generate_test_data(10000);

10.3 使用触发器验证插入数据

-- 创建触发器验证插入的数据
DELIMITER //
CREATE TRIGGER before_employee_insert
BEFORE INSERT ON employees
FOR EACH ROW
BEGIN-- 检查薪资范围IF NEW.salary < 0 THENSIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = 'Salary cannot be negative';END IF;-- 确保入职日期不在未来IF NEW.hire_date > CURRENT_DATE THENSIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = 'Hire date cannot be in the future';END IF;

结语
感谢您的阅读!期待您的一键三连!欢迎指正!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软考-软件设计师中级备考 14、刷题 算法

一、考点归纳 1&#xff09;排序 2、查找 3、复杂度 4、经典问题 0 - 1 背包动态规划0 - 1 背包问题具有最优子结构性质和重叠子问题性质。通过动态规划可以利用一个二维数组来记录子问题的解&#xff0c;避免重复计算&#xff0c;从而高效地求解出背包能装下的最大价值。分…

【阿里云】阿里云 Ubuntu 服务器无法更新 systemd(Operation not permitted)的解决方法

零、前言 目前正在使用的Ubuntu服务器中&#xff0c;仅阿里云&#xff08;不止一台&#xff09;出现了这个问题&#xff0c;因此我判定是阿里云服务器独有的问题。如果你的服务器提供商不是阿里云&#xff0c;那么这篇文章可能对你没有帮助。 如果已经因为升级错误导致依赖冲突…

css 点击后改变样式

背景&#xff1a; 期望实现效果&#xff1a;鼠标点击之后&#xff0c;保持选中样式。 实现思路&#xff1a;在css样式中&#xff0c;:active 是一种伪类&#xff0c;用于表示用户当前正在与被选定的元素进行交互。当用户点击或按住鼠标时&#xff0c;元素将被激活&#xff0c;此…

采用AI神经网络降噪算法的语言降噪消回音处理芯片NR2049-P

随着AI时代来临.通话设备的环境噪音抑制也进入AI降噪算法时代. AI神经网络降噪技术是一款革命性的语音处理技术&#xff0c;他突破了传统单麦克风和双麦克风降噪的局限性,利用采集的各种日常环境中的噪音样本进行训练学习.让降噪算法具有自适应噪声抑制功能&#xff0c;可以根…

不用联网不用编程,PLC通过智能网关快速实现HTTP协议JSON格式与MES等系统平台双向数据通讯

智能网关IGT-DSER集成了多种PLC的原厂协议&#xff0c;方便实现各种PLC、智能仪表通过HTTP协议与MES等各种系统平台通讯对接。PLC内不用编写程序&#xff0c;设备不用停机&#xff0c;通过网关的参数配置软件(下载地址)配置JSON文件的字段与PLC寄存器地址等参数即可。 …

如何将两台虚拟机进行搭桥

将两台虚拟机实现网络互通&#xff08;“搭桥”&#xff09;需配置虚拟网络&#xff0c;以下是基于 VMware Workstation 和 VirtualBox 的详细操作指南&#xff08;以 Windows 系统为例&#xff0c;Linux 原理类似&#xff09;&#xff1a; 一、VMware Workstation 配置&#x…

Xianyu AutoAgent,AI闲鱼客服机器人

Xianyu AutoAgent是一款专为闲鱼平台开发的智能客服机器人系统&#xff0c;旨在提供全天候的自动化服务。它具备多专家协同决策、智能议价和上下文感知对话等功能&#xff0c;能够管理轻量级的对话记忆&#xff0c;利用完整的对话历史为用户提供更自然的交流体验。 Xianyu Aut…

键盘输出希腊字符方法

在不同操作系统中&#xff0c;输出希腊字母的方法有所不同。以下是针对 Windows 和 macOS 系统的详细方法&#xff0c;以及一些通用技巧&#xff1a; 1.Windows 系统 1.1 使用字符映射表 字符映射表是一个内置工具&#xff0c;可以方便地找到并插入希腊字母。 • 步骤&#xf…

什么是SparkONYarn模式

1. 什么是 Spark on YARN&#xff1f; Spark on YARN 是 Apache Spark 的一种部署模式&#xff0c;允许 Spark 应用程序在 Hadoop YARN 集群上运行&#xff0c;充分利用 YARN 的资源管理和调度能力。这种模式将 Spark 与 Hadoop 生态深度集成&#xff0c;使企业能够在同一集群…

【git】clone项目后续,github clone的网络配置,大型项目git log 输出txt,切换commit学习,goland远程,自存档

git网络配置&#xff0c;解决git clone github速度奇慢 git config --global http.proxy http://127.0.0.1:7897 git config --global https.proxy http://127.0.0.1:7897git log输出到文件&#xff08;便于checkout&#xff09; 这里有些字符如表情会乱码&#xff0c;不知道…

Java游戏服务器开发流水账(3)游戏数据的缓存简介

简介 游戏服务器数据缓存是一种在游戏服务器运行过程中&#xff0c;用于临时存储经常访问的数据的技术手段&#xff0c;旨在提高游戏性能、降低数据库负载以及优化玩家体验。游戏开发中数据的缓存可以使用Java自身的内存也可以使用MemCache&#xff0c;Redis&#xff0c;注意M…

STL?vector!!!

一、前言 之前我们借助手撕string加深了类和对象相关知识&#xff0c;今天我们将一起手撕一个vector&#xff0c;继续深化类和对象、动态内存管理、模板的相关知识 二、vector相关的前置知识 1、什么是vector&#xff1f; vector是一个STL库中提供的类模板&#xff0c;它是存储…

C++学习之路,从0到精通的征途:继承

目录 一.继承的概念及定义 1.继承的概念 2.继承的定义 (1)继承的定义格式 (2)继承基类成员访问方式的变化 二.基类与派生类间的转换 1.派生类对象赋值给基类的引用/指针 2. 派生类对象直接赋值给基类对象 三.继承的作用域 四.派生类的默认成员函数 1.构造函数 2.拷…

用vue和go实现登录加密

前端使用CryptoJS默认加密方法&#xff1a; var pass CryptoJS.AES.encrypt(formData.password, key.value).toString()使用 CryptoJS.AES.encrypt() 时不指定加密模式和参数时&#xff0c;CryptoJS 默认会执行以下操作 var encrypted CryptoJS.AES.encrypt("明文&quo…

React百日学习计划——Deepseek版

阶段一&#xff1a;基础巩固&#xff08;1-20天&#xff09; 目标&#xff1a;掌握HTML/CSS/JavaScript核心语法和开发环境搭建。 每日学习内容&#xff1a; HTML/CSS&#xff08;1-10天&#xff09; 标签语义化、盒模型、Flex布局、Grid布局、响应式设计&#xff08;媒体查询…

WPF中如何自定义控件

WPF自定义控件简化版&#xff1a;账户菜单按钮&#xff08;AccountButton&#xff09; 我们以**“账户菜单按钮”为例&#xff0c;用更清晰的架构实现一个支持标题显示、渐变背景、选中状态高亮**的自定义控件。以下是分步拆解&#xff1a; 一、控件核心功能 我们要做一个类似…

Deepseek+Xmind:秒速生成思维导图与流程图

deepseekxmind&#xff0c;快速生成思维导图和流程图 文章目录 思维导图deepseek笔记本 txt文件xmind 流程图deepseekdraw.io 思维导图 deepseek 笔记本 txt文件 将deep seek的东西复制到文本文件中&#xff0c;然后将txt文件拓展名改成md xmind 新建思维导图----左上角三…

基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…

服务器机架的功能和重要性

服务器已经成为各个行业必不可少的网络设备&#xff0c;而服务器机架则是数据中心和IT基础设施中不可或缺的重要组成部分&#xff0c;服务器机架能够为服务器和其他网络设备提供物理支撑&#xff0c;同时还可以提供设备维护和管理等多种功能&#xff0c;本文就来介绍一下服务器…

游戏引擎学习第277天:稀疏实体系统

回顾并为今天定下基调 上次我们结束的时候&#xff0c;基本上已经控制住了跳跃的部分&#xff0c;达到了我想要的效果&#xff0c;现在我们主要是在等待一些新的艺术资源。因此&#xff0c;等新艺术资源到位后&#xff0c;我们可能会重新处理跳跃的部分&#xff0c;因为现在的…