在MySQL数据库中,多表的增删改查操作是日常数据库管理和维护的重要组成部分,下面将通过一个假设的场景——"Enhanced Toast"餐厅管理系统,来展示如何进行多表的增删改查操作。

增加数据 (INSERT)
创建表格
我们需要创建两个表格:一个是restaurants表格存储餐厅信息,另一个是dishes表格存储菜品信息。
CREATE TABLE restaurants (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
address VARCHAR(255) NOT NULL
);
CREATE TABLE dishes (
id INT AUTO_INCREMENT PRIMARY KEY,
restaurant_id INT,
name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id)
);
插入数据
向restaurants表格添加一条餐厅记录,并向dishes表格添加几条关联的菜品记录。
INSERT INTO restaurants (name, address) VALUES ('Enhanced Toast', '123 Food Street');
INSERT INTO dishes (restaurant_id, name, price) VALUES
(LAST_INSERT_ID(), 'Cheese Toast', 5.99),
(LAST_INSERT_ID(), 'Avocado Toast', 6.99),
(LAST_INSERT_ID(), 'Honey Toast', 7.99);
查询数据 (SELECT)
单表查询
我们可以单独查询餐厅或菜品的信息。
SELECT * FROM restaurants; SELECT * FROM dishes;
联合查询
更常见的是我们需要从两个表中检索信息,例如查询某个餐厅的所有菜品及其价格。
SELECT r.name AS restaurant_name, d.name AS dish_name, d.price FROM restaurants r JOIN dishes d ON r.id = d.restaurant_id WHERE r.name = 'Enhanced Toast';
更新数据 (UPDATE)
如果我们需要更新某个餐厅的地址或者修改菜品的价格,可以使用UPDATE语句。
UPDATE restaurants SET address = '456 New Food Lane' WHERE name = 'Enhanced Toast'; UPDATE dishes SET price = 8.99 WHERE name = 'Cheese Toast';
删除数据 (DELETE)
如果需要从系统中移除某个餐厅或菜品的信息,可以使用DELETE语句。
DELETE FROM restaurants WHERE name = 'Enhanced Toast'; DELETE FROM dishes WHERE restaurant_id = (SELECT id FROM restaurants WHERE name = 'Enhanced Toast');
相关问题与解答
Q1: 如果dishes表格中的restaurant_id字段没有与任何restaurants表格中的id字段匹配,会发生什么?
A1: 如果dishes表格中的restaurant_id字段没有与任何restaurants表格中的id字段匹配,那么这条菜品记录将成为“孤儿记录”,即它引用了一个不存在的餐厅,为了避免这种情况,我们在创建dishes表格时已经设置了外键约束,确保restaurant_id必须存在于restaurants表格的id字段中,如果违反了这个约束,插入或更新操作将会失败。
Q2: 如果我想删除所有菜品后自动删除对应的餐厅记录,应该如何实现?
A2: 要实现级联删除,你需要在创建dishes表格时为restaurant_id字段设置ON DELETE CASCADE选项,这样当一个餐厅被删除时,所有属于该餐厅的菜品也将自动被删除,以下是修改后的dishes表格创建语句:
CREATE TABLE dishes (
id INT AUTO_INCREMENT PRIMARY KEY,
restaurant_id INT,
name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (restaurant_id) REFERENCES restaurants(id) ON DELETE CASCADE
);
启用级联删除可能会对数据完整性造成影响,因此在启用之前应该仔细考虑其后果。