如何使用Innodb确保MySQL中的多个表列是唯一的(或重组我的表)?
我目前有两个单独的表,其中第三个表将被添加,其中存储食谱、项目和定制餐(要创建的一个) 我希望创建一个膳食计划器,用户可以在其中添加食谱、项目或自定义项目作为特定日期的早餐/午餐/晚餐 我对下面的新桌子有了一个想法,尽管沿着这条路走下去,我无法确保膳食计划器.id只能是食谱、项目或定制。如何使用Innodb确保MySQL中的多个表列是唯一的(或重组我的表)?,mysql,database,foreign-keys,innodb,Mysql,Database,Foreign Keys,Innodb,我目前有两个单独的表,其中第三个表将被添加,其中存储食谱、项目和定制餐(要创建的一个) 我希望创建一个膳食计划器,用户可以在其中添加食谱、项目或自定义项目作为特定日期的早餐/午餐/晚餐 我对下面的新桌子有了一个想法,尽管沿着这条路走下去,我无法确保膳食计划器.id只能是食谱、项目或定制。 通过编写良好的查询,我意识到这永远不应该成为一个问题,尽管作为一个对数据库仍有大量了解的人,我更希望有一个解决方案,确保在不应该输入数据的情况下永远不会输入数据 我已经在使用的表中当前感兴趣的列有: recip
通过编写良好的查询,我意识到这永远不应该成为一个问题,尽管作为一个对数据库仍有大量了解的人,我更希望有一个解决方案,确保在不应该输入数据的情况下永远不会输入数据 我已经在使用的表中当前感兴趣的列有:
recipe.id
item.id
user.id
我目前对“膳食计划表”的看法是:
表:膳食规划师
id - primary key
user_id - foreign key user.id
mdate - the day which the meal is planned for
mtime - whether the meal is breakfast, lunch or dinner.
mcomment (can be null)
餐桌:一餐是食谱
meal_id - foreign key meal_planner.id
recipe_id - foreign key recipe.id
餐桌:用餐是定制的
meal_id - foreign key meal_planner.id
custom_id - foreign key custom_meal.id
餐桌:餐点
meal_id - foreign key meal_planner.id
item_id - foreign key item.id
餐桌:定制餐
id - primary key
user_id - foreign key user.id
name - varchar to hold the name of the meal
这应该允许我使用连接来获取显示所需的所有数据,尽管如前所述,它们没有限制停止在配方、项目和/或自定义中使用的mean.id。好的,所以自从发布此消息后,我发现了“触发器” 触发器与存储过程类似,但在触发器情况下,当满足设置的条件时(例如在完成表的插入、更新或删除之前),触发器将自动激发 在我的例子中,我创建了六个触发器,每个表两个触发器,用于检查其他表中是否已经存在该表的id,如果已经存在,则返回一个错误而不是插入 通过使用示例进行phpmyadmin查询,我没有任何运气,因此我在phpmyadmin中创建了触发器,方法是选择数据库,单击“触发器”选项卡,单击“添加新触发器”,然后输入以下内容(针对每个不同的表进行了轻微修改,无论是插入还是更新) 触发器名称:
deam\u是\u recipe\u before insert
表:膳食是食谱
时间:之前
事件:插入
定义:
BEGIN
DECLARE custom_match INT;
DECLARE item_match INT;
SELECT COUNT(1) INTO custom_match FROM meal_is_custom
WHERE meal_id = NEW.meal_id;
IF custom_match > 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'A Custom record with that meal id already exists';
ELSE
SELECT COUNT(1) INTO item_match FROM meal_is_item
WHERE meal_id = NEW.meal_id;
IF item_match > 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'An Item record with that meal id already exists';
END IF;
END IF;
END
定义者:我将此项留空,作为查询是否可以运行触发器的用户
我相信我也应该能够在MySQL查询中获得相同的结果,但正如我在phpmyadmin中提到的,这对我来说并不直接起作用,而不是进一步研究它,触发器选项卡非常简单:
DELIMITER //
CREATE TRIGGER meal_is_recipe_BeforeInsert BEFORE INSERT ON meal_is_recipe
BEGIN
DECLARE custom_match INT;
DECLARE item_match INT;
SELECT COUNT(1) INTO custom_match FROM meal_is_custom
WHERE meal_id = NEW.meal_id;
IF custom_match > 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'A Custom record with that meal id already exists';
ELSE
SELECT COUNT(1) INTO item_match FROM meal_is_item
WHERE meal_id = NEW.meal_id;
IF item_match > 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'An Item record with that meal id already exists';
END IF;
END IF;
END//
DELIMITER ;
正如我在问题中提到的,我的数据库知识还有很长的路要走,因此,虽然我已经用我的初始问题模式测试了这一点,并且它是有效的,但我不能保证这是实现结果的最有效的方法