在數據庫中,我們經常需要通過刪除一張表中的數據來刪除另一張表中相關數據的情況。MySQL中提供了兩張表之間通過外鍵關聯并進行刪除的方法。關于MySQL兩張表之間的關聯,請看下面的代碼示例:
CREATE TABLE parent ( id INT NOT NULL, PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE child ( id INT, parent_id INT, INDEX par_ind (parent_id), FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE JOIN ) ENGINE=INNODB;
在上述示例中,child表中的parent_id列通過FOREIGN KEY指向了parent表的id。在進行DELETE操作時,我們通過設置ON DELETE CASCADE選項來實現在parent中刪除一行數據時,在child表中自動刪除所有與該行相關的子行。
下面是一個具體的示例,演示如何使用外鍵關聯和級聯刪除。首先,我們創建兩張表:
CREATE TABLE customers ( id INT, name VARCHAR(50), PRIMARY KEY (id) ) ENGINE=INNODB; CREATE TABLE orders ( id INT, customer_id INT, amount DECIMAL(10,2), FOREIGN KEY (customer_id) REFERENCES customers(id) ON DELETE CASCADE, PRIMARY KEY (id) ) ENGINE=INNODB;
在此示例中,我們創建了一個customers表,其中包含了顧客的id和name,以及一個orders表,用于存儲顧客的訂單信息。為了通過外鍵關聯,我們在orders表中創建了一個customer_id列,指向顧客表中的id列。在外鍵約束中,我們設置了ON DELETE CASCADE選項,它表示在從customers表中刪除一行數據時,同時會刪除對應的所有orders表中的數據。
下一步,我們向customers表和orders表中添加一些示例數據:
INSERT INTO customers (id, name) VALUES (1, '張三'); INSERT INTO customers (id, name) VALUES (2, '李四'); INSERT INTO orders (id, customer_id, amount) VALUES (1, 1, 100.12); INSERT INTO orders (id, customer_id, amount) VALUES (2, 1, 99.99); INSERT INTO orders (id, customer_id, amount) VALUES (3, 2, 125.05);
現在我們可以通過使用DELETE語句來測試ON DELETE CASCADE選項是否正常工作:
DELETE FROM customers WHERE id=1;
在這個例子中,我們刪除了id等于1的顧客。由于在orders表中customer_id列通過外鍵指向了customers表的id列,并且我們設置了ON DELETE CASCADE選項,我們刪除customers表中的這行數據后,會同時刪除orders表中與該顧客相關的所有訂單數據。
在MySQL中,通過兩張表之間的外鍵關聯,我們可以方便地實現級聯刪除,從而避免了手動刪除所有相關行數據的繁瑣工作。