面试题答案
一键面试导入场景下的数据完整性校验
- 主键唯一校验:
- 使用
LOAD DATA
语句:当使用LOAD DATA INFILE
导入数据时,MySQL会自动根据表定义中的主键约束进行主键唯一性检查。如果导入的数据中存在重复的主键值,默认情况下,MySQL会停止导入并报错。例如:
LOAD DATA INFILE 'path/to/file.csv' INTO TABLE your_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES;
- 使用事务:可以将导入操作放在事务中。如果导入过程中出现主键冲突,整个事务回滚,保证数据的一致性。
START TRANSACTION; LOAD DATA INFILE 'path/to/file.csv' INTO TABLE your_table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES; COMMIT;
- 工具:
mysqlimport
工具,它是LOAD DATA INFILE
的命令行接口,同样会按照表的主键约束进行检查。例如:
mysqlimport -u your_user -p --local your_database path/to/file.csv
- 使用
- 外键关联正确校验:
- 数据库约束:MySQL会在导入数据时检查外键约束。确保导入的数据中的外键值在对应的父表中存在。例如,有
orders
表和customers
表,orders
表中有customer_id
外键关联customers
表的id
主键。当导入orders
表数据时,如果customer_id
值在customers
表中不存在,导入会失败并报错。 - 先导入父表数据:在导入有外键关联的表数据时,先导入父表数据,再导入子表数据,以确保外键关联正确。例如,先导入
customers
表数据,再导入orders
表数据。 - 使用触发器:可以创建触发器在数据导入前检查外键关联。例如,在
orders
表上创建一个BEFORE INSERT
触发器,检查customer_id
是否存在于customers
表中。
DELIMITER // CREATE TRIGGER before_orders_insert BEFORE INSERT ON orders FOR EACH ROW BEGIN DECLARE count_customer INT; SELECT COUNT(*) INTO count_customer FROM customers WHERE id = NEW.customer_id; IF count_customer = 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid customer_id'; END IF; END // DELIMITER ;
- 数据库约束:MySQL会在导入数据时检查外键约束。确保导入的数据中的外键值在对应的父表中存在。例如,有
导出场景下的数据完整性校验
- 主键唯一校验:
- 在导出前检查:可以使用
SELECT
语句结合GROUP BY
和HAVING
子句来检查主键是否唯一。例如,对于users
表,检查user_id
主键:
如果查询结果为空,则表示主键唯一;否则,结果集中会显示重复的主键值及其重复次数。SELECT user_id, COUNT(*) FROM users GROUP BY user_id HAVING COUNT(*) > 1;
- 工具:可以使用数据库管理工具(如phpMyAdmin)在导出前执行上述查询来确认主键唯一性。在phpMyAdmin中,在SQL选项卡中输入上述查询语句执行。
- 在导出前检查:可以使用
- 外键关联正确校验:
- 使用
JOIN
检查:可以通过JOIN
操作检查外键关联是否正确。例如,检查orders
表的customer_id
外键关联customers
表的id
主键:
如果查询结果为空,则表示外键关联正确;否则,结果集中会显示外键值在父表中不存在的记录。SELECT orders.order_id, orders.customer_id, customers.id FROM orders LEFT JOIN customers ON orders.customer_id = customers.id WHERE customers.id IS NULL;
- 工具:同样可以使用数据库管理工具(如phpMyAdmin)执行上述
JOIN
查询来校验外键关联。在phpMyAdmin的SQL选项卡中输入并执行查询语句。
- 使用