MySQL支持多种约束,其中包括外键约束,可以用来保证数据的完整性和一致性。在使用外键约束时,如果需要删除一张主表上的某一行,必须先删除与之相关的从表行或将从表行的外键列设置为NULL,否则将会抛出错误。
假设有两张表,一张为订单表,另外一张为订单明细表,订单明细表中有一个外键约束指向订单表中的订单ID:
CREATE TABLE orders (order_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,customer_id INT NOT NULL,order_date DATE);CREATE TABLE order_details (detail_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,order_id INT,product_id INT,quantity INT,FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE);
这里的ON DELETE CASCADE表示当订单表中的某一行被删除时,与该行相关的订单明细表中的所有行也会被自动删除。如果想在删除订单表中的某一行时同时删除该行对应的所有订单明细表中行,只需要执行以下SQL语句即可:
DELETE FROM orders WHERE order_id = 123;
此时,如果订单表中有某些订单行与订单明细表中的行存在关联,则这些行会被自动删除。如果想删除订单表中特定订单行的关联行而不是所有行,可以执行类似以下的语句:
DELETE FROM order_details WHERE order_id = 123;
注意,如果在删除订单表中的一行前,没有删除与之相关的从表行或将从表行的外键列设置为NULL,会抛出以下错误:
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails.