在表中设置一个字段,用于存储与两个外键有关的数据和编号

时间:2011-12-23 14:10:02

标签: mysql phpmyadmin innodb myisam

我有一个与使用以下结构设置第三个表( Repair_Parts 表)有关的问题:

部分

Part_id(INT,无符号,自动增量) - 主键

Part_name(VARCHAR(50)) - 唯一

Part_descrip(TEXT)

修复

Repair_id(INT,unsigned,autoincrement) - 主键

Repair_name(VARCHAR(50)) - 唯一

Repair_descrip(TEXT)

Repair_Parts

Repair_id(外键 - 与修复表的Repair_id字段有关)

Part_id(外键 - 与Part Table的Part_id字段有关)

Repair_Part_Item# - 根据与特定Repair_id相关的Part_id字段条目的数量进行编号(用于存储与修复相关的部分的数据) - 我希望此字段为每个不同的repair_id开始编号为“1”。

问题

例如,假设一个php程序允许用户创建如何进行汽车维修的指导。用户指示修复是“检查电池”(将数据插入Repair_name字段下的Repair表(VARCHAR(50))和修复的简短描述(将数据插入Repair_descrip字段下的Repair表中) TEXT))。用户还可以指定“检查电池”维修中涉及的特定部件,可能是一个或多个,但在这种情况下,它只有2个不同的部件,“交流发电机”和“电池”。在不同的条目中,用户指定三个部分进行不同的修复。

如何在phpMyAdmin或MySQL中创建此Repair_Parts表,以便数据库跟踪修复所需的特定部件?应该使用什么引擎? MyISAM或INNODB?

从我读过的关于数据库规范化的内容来看,我似乎有正确的方法来构建我的表,但我无法弄清楚如何使Repair_Part_Item#字段以我想要的方式存储数据。具体来说,假设我以可接受的方式分解了我的表及其字段,我将如何让Repair_Part_Item#字段为每个不同的Repair_id字段条目开始编号为1,并为具有相同Repair_id的每一行计数不同的Part_id(并且不允许具有相同Repair_id和Part_id的重复行)?

从我读到的关于规范化的内容来看,这似乎是构造表的正确方法,但我无法弄清楚如何使Repair_Part_Item#字段正常工作。

我是MySQL和PHP的相对新手,我只是在进入PHP方面之前尝试设置数据库。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你想要的是根据当前的Repair_id生成一个从1开始生成序列的字段。通过使用MyISAM引擎的功能可以最好地实现此功能,您可以在其中创建复合主键((Repair_id, id)idauto_increment) - 但是,MyISAM表默默地忽略外键关系,因此存在将不会进行级联删除或更新。 InnoDB支持外键约束,但它不像MyISAM那样支持auto_increment生成。您可以做的最好的事情是创建一个触发器,根据当前Repair_id生成一个递增1的序号。

DELIMITER $$

CREATE TRIGGER `your_trigger_name` AFTER INSERT ON `your_table_name` 
FOR EACH ROW BEGIN 

SET new.Repair_Part_Item = (SELECT IF(ISNULL(Repair_Pair_Item, 1, MAX(Repair_Part_Item) + 1) FROM your_table_name WHERE Repair_id = new.Repair_id);

END 

DELIMITER ;