Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Innodb确保MySQL中的多个表列是唯一的(或重组我的表)?_Mysql_Database_Foreign Keys_Innodb - Fatal编程技术网

如何使用Innodb确保MySQL中的多个表列是唯一的(或重组我的表)?

如何使用Innodb确保MySQL中的多个表列是唯一的(或重组我的表)?,mysql,database,foreign-keys,innodb,Mysql,Database,Foreign Keys,Innodb,我目前有两个单独的表,其中第三个表将被添加,其中存储食谱、项目和定制餐(要创建的一个) 我希望创建一个膳食计划器,用户可以在其中添加食谱、项目或自定义项目作为特定日期的早餐/午餐/晚餐 我对下面的新桌子有了一个想法,尽管沿着这条路走下去,我无法确保膳食计划器.id只能是食谱、项目或定制。 通过编写良好的查询,我意识到这永远不应该成为一个问题,尽管作为一个对数据库仍有大量了解的人,我更希望有一个解决方案,确保在不应该输入数据的情况下永远不会输入数据 我已经在使用的表中当前感兴趣的列有: recip

我目前有两个单独的表,其中第三个表将被添加,其中存储食谱、项目和定制餐(要创建的一个)

我希望创建一个膳食计划器,用户可以在其中添加食谱、项目或自定义项目作为特定日期的早餐/午餐/晚餐

我对下面的新桌子有了一个想法,尽管沿着这条路走下去,我无法确保膳食计划器.id只能是食谱、项目或定制。
通过编写良好的查询,我意识到这永远不应该成为一个问题,尽管作为一个对数据库仍有大量了解的人,我更希望有一个解决方案,确保在不应该输入数据的情况下永远不会输入数据

我已经在使用的表中当前感兴趣的列有:

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 ;
正如我在问题中提到的,我的数据库知识还有很长的路要走,因此,虽然我已经用我的初始问题模式测试了这一点,并且它是有效的,但我不能保证这是实现结果的最有效的方法