2011-12-23 15 views
1

我有涉及具有以下结构的建立第三表(Repair_Parts表)一个问题:设置一个字段中的表,用于存储与两个外键数据,和编号

部分

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

Part_name(VARCHAR(50)) - 独特

Part_d escrip(TEXT)

修复

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

Repair_name(VARCHAR(50)) - 独特

Repair_descrip(TEXT)

Repair_Parts

Repair_id(外键 - 涉及到修表的Repair_id场)

PART_ID(外键 - 涉及到部分表的PART_ID场)

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

问题

例如,可以说一个PHP程序允许用户创建如何做一个汽车修理方向。用户表示修复为“检查电池”(将电池插入Repair_name字段(VARCHAR(50))下的Repair表中)以及修复的简短说明(该修复将数据插入Repair_descrip字段下的Repair表中用户也可以指定“检查电池”修理中涉及的特定部件,可能是一个或多个,但在这种情况下,它只有两个不同的部件,即“交流发电机”和“电池”。在不同的条目中,用户指定三个部分进行不同的修复。

如何在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方程之前设置数据库。

回答

2

如果我理解正确,你想要的是有一定的领域,从目前Repair_id基于当前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 ; 
+0

感谢您的回复。所以repair_id和part_id字段将是什么类型? INT? VARCHAR?或者它甚至重要?对不起,如果这应该是显而易见的。我是新来的。 – 2011-12-23 15:21:14

+0

FK总是被绑定为它们指向的类型。因此,如果您的'part_id'指向'parts.id',它必须与'parts.id'具有相同的类型和显示长度。为了简短起见,请使用表格的整数。 – 2011-12-23 15:29:08

+0

触发器名称是您选择的任何内容。请记住,我最有可能在我的SQL语法中有错误,我只是将它作为参考发布,以便您可以看到如何创建一个这样的触发器。这个想法是,你根据'Repair_id'值增加'Repair_Part_Item'号码。如果'Repair_Part_Item'为NULL(或零,我不知道你为列的默认值指定了什么),那么它是序列的第一个成员(数字1)。这就是逻辑 - 实施可能会关闭,因为我没有测试,如果我真的写了触发器:) – 2011-12-23 16:02:28

相关问题