面试题答案
一键面试- 添加临时列:
- 在
orders
表中添加一个临时列来存储更新前的customer_id
。假设临时列名为temp_customer_id
。
ALTER TABLE orders ADD COLUMN temp_customer_id INT;
- 将当前
customer_id
的值复制到临时列中。
UPDATE orders SET temp_customer_id = customer_id;
- 在
- 更新
customers
表:- 假设要将
customers
表中customer_id
为old_customer_id
的值更新为new_customer_id
。
UPDATE customers SET customer_id = new_customer_id WHERE customer_id = old_customer_id;
- 假设要将
- 更新
orders
表:- 根据临时列的值,更新
orders
表中的customer_id
。
UPDATE orders SET customer_id = new_customer_id WHERE temp_customer_id = old_customer_id;
- 根据临时列的值,更新
- 删除临时列:
- 操作完成后,删除
orders
表中的临时列。
ALTER TABLE orders DROP COLUMN temp_customer_id;
- 操作完成后,删除
另一种方法(使用事务和外键约束):
- 确保外键约束:
- 确保
orders
表的customer_id
列与customers
表的customer_id
列之间存在外键约束。如果没有,可以添加外键约束。
ALTER TABLE orders ADD CONSTRAINT fk_customer_id FOREIGN KEY (customer_id) REFERENCES customers(customer_id);
- 确保
- 开始事务:
START TRANSACTION;
- 更新
customers
表:- 假设要将
customers
表中customer_id
为old_customer_id
的值更新为new_customer_id
。
UPDATE customers SET customer_id = new_customer_id WHERE customer_id = old_customer_id;
- 假设要将
- 更新
orders
表:- 根据
customers
表的更新,更新orders
表中的customer_id
。
UPDATE orders SET customer_id = new_customer_id WHERE customer_id = old_customer_id;
- 根据
- 提交事务:
COMMIT;
注意:在实际操作中,根据数据库管理系统的不同,外键约束的级联更新功能可能也可以实现此需求,例如在MySQL中,可以在创建外键时指定ON UPDATE CASCADE
,这样当customers
表中的customer_id
更新时,orders
表中的customer_id
会自动更新。
-- 创建表时设置外键并开启级联更新
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ON UPDATE CASCADE
);
然后直接更新customers
表中的customer_id
,orders
表中的customer_id
会自动同步更新。
UPDATE customers SET customer_id = new_customer_id WHERE customer_id = old_customer_id;