Установка поля в таблице для хранения данных, относящихся к двум внешним ключам, и нумерация - PullRequest
1 голос
/ 23 декабря 2011

У меня есть вопрос, связанный с настройкой третьей таблицы ( Repair_Parts таблица) со следующей структурой:

Деталь Таблица

Part_id (INT, без знака, автоинкремент) - первичный ключ

Part_name (VARCHAR (50)) - уникальный

Part_descrip (TEXT)

Ремонт Таблица

Repair_id (INT, без знака, автоинкремент) - первичный ключ

Repair_name (VARCHAR (50)) - уникальный

Repair_descrip (TEXT)

Repair_Parts Таблица

Repair_id (внешний ключ - относится к полю Repair_id таблицы восстановления)

Part_id (внешний ключ - относится к полю Part_id таблицы деталей)

Repair_Part_Item # - нумерация, основанная на количестве записей в поле Part_id, относящихся к конкретному Repair_id (используется для хранения данных о деталях, связанных с ремонтом) - я хочу, чтобы это поле начинало нумерацию с «1» для каждого отдельного repair_id.

Вопрос

Например, допустим, программа php позволяет пользователю создавать инструкции по ремонту автомобилей. Пользователь указывает, что исправление - это «Проверка батареи» (которое вставляет данные в таблицу «Восстановление» в поле «Repair_name» (VARCHAR (50)) и краткое описание исправления (которое вставляет данные в таблицу «Восстановление» в поле «Repair_descrip» ( ТЕКСТ)). Пользователь также может указать конкретные детали, участвующие в ремонте «Проверка батареи», которые могут быть одной или несколькими, но в этом случае это только две разные части, «Генератор» и «Аккумулятор». В другой записи пользователь указывает три детали для другого ремонта.

Как можно было бы создать эту таблицу Repair_Parts в phpMyAdmin или MySQL, чтобы база данных отслеживала конкретные детали, необходимые для ремонта? Какой двигатель следует использовать? MyISAM или INNODB?

Из того, что я прочитал о нормализации баз данных, у меня, кажется, есть правильный способ структурировать мои таблицы, но я не могу понять, как сделать поле Repair_Part_Item # для хранения данных так, как я хочу. В частности, при условии, что я разбил свои таблицы и их поля приемлемым образом, как бы получить в поле Repair_Part_Item # начальную нумерацию с 1 для каждой отдельной записи поля Repair_id и подсчитать для каждой строки с тем же Repair_id с помощью другой Part_id (и не позволяющий дублировать строки с одинаковыми Repair_id и Part_id)?

Из того, что я читал о нормализации, это кажется правильным способом структурирования моих таблиц, но я не могу понять, как сделать так, чтобы поле Repair_Part_Item # работало правильно.

Я относительный новичок в MySQL и PHP, и я просто пытаюсь настроить базы данных, прежде чем перейти к PHP-стороне уравнения.

1 Ответ

2 голосов
/ 23 декабря 2011

Если я правильно понял, вам нужно иметь определенное поле, которое генерирует последовательность, начинающуюся с 1, основываясь на текущем Repair_id.Эту функцию лучше всего реализовать с помощью функции механизма MyISAM, в которой вы создаете составной первичный ключ ((Repair_id, id) с id, равным auto_increment) - однако таблицы MyISAM беззвучно игнорируют отношения внешнего ключа, поэтому каскадные удаления не будутобновления.InnoDB поддерживает ограничения внешнего ключа, но не поддерживает генерацию auto_increment так же, как MyISAM.Лучшее, что вы можете сделать, - это создать триггер, который сгенерирует порядковый номер, увеличенный на 1 в зависимости от текущего Repair_id.

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 ;
...