Задавайте вопросы, мы ответим
Вы не зашли.
добрый день, у меня проблема с базой, мучаюсь уже недели 2
строение такое:
таблица устройство
id(auto_incr) ustroistvo(УНИКАЛЬНЫЙ) author
1 Редутор flip
2 Механизм vova
таблица поиск
id(auto_incr) id_ustr id_instr
1 1 1
2 1 2
3 1 3
4 2 2
4 2 3
таблица инструменты
id(auto_incr) instr(уникальный) massa
1 молоток 2
2 стамеска 1,2
3 клещи 0,7
надеюсь понятно, что таблица поиск объединяет таблицы устройство и инструменты
помогите сделать правильное добавление в базу и правильное удаление
+ косяк в том, что если редактировать таблицу инструменты, и поправить например "молотк" на "молоток", а молоток у нас уже есть, то надо удалить поле с "молотк" и переправить значения соответсвующих полей в таблице поиск
мои запросы на добавление:
insert into ustr ('0', редуктор)
//узнаем номер добавленного устройства
$n_ustr=select ustroistvo from ustr where ustroistvo='редуктор'
//количество инструментов, соответствующих данному устройству
$num_rows_instr=3
for ($i=0;$i<$num_rows_instr;$i++)
{
//добавление в таблицу инструментов, в примере 1 шаг цикла
insert into instr ('0','молоток')
//выбираем id добавленного инструмента
$n_instr=select id from instr where instr='молоток'
//добавляем связь инструмента и устройства в таблиц поиск
insert into poisk ('0','$n_ustr','$n_instr')
}
все показано схематично, кстати перестаньте смпеяться, я действиетльно "деревня"
косяк в том, что id в ustr и id в instr - auto_increment и я не знаю их значения, до добавления в соответствующие таблицы, приходится каждый раз добавлять и сразу выбирать.
таблица инструменты заполняется в процессе заполнения таблицы устройств, тоесть из формы я передаю все данные по устройству + данные по некоторым инструментам, если данный инструмент есь в базе то выбироаю его номер и добавлчяю в таблицу поиск, если он новый - то добавляю его, выбираю id добавленного инструмента, и потом добавляю в таблицу поиск.
на самом деле, это все написано, но багов - куча... думаю сделать заново и получше. если никто не поможет, заполню до упора руками таблицу инструменты, и не буду туда добавлть.
Может сделать связи таблиц?
между инструментами и поиском instr.id referent poisk.id_instr on delete restrict on update cascade
Неактивен
Ммм... ну во первых узнать ID добавляемого инструмента можно php функцией mysql_insert_id() вызвав оную сразу после выполнения запроса
косяк в том, что id в ustr и id в instr - auto_increment и я не знаю их значения, до добавления в соответствующие таблицы, приходится каждый раз добавлять и сразу выбирать.
А значения то одинаковы? Просто не особо понятна ваша проблема и тип таблиц было бы полезно указать
Неактивен
InnoDB но для меня не важен их тип
значения не одинаковы, просто это уникальные значения, чтоб легче было делать выборку.
проблема, в оптимизации запросов, например можно в 2 таблицы добавлять 1 запросом, или выбирать из 2 таблиц сразу.
Неактивен
Насколько я понимаю, проблема именно в том, чтобы переименовать «молотк» в «молоток» при уже
существующем нормальном молотке. И стандартными средствами это никак не сделать, нужно писать
какой-то умный код. Я бы делал по такому алгоритму:
1. Переименовать «молотк» в «молоток». Если получили ошибку («молоток» уже есть), то:
2. Оставить «молоток» в покое, он уже и так хороший.
3. Добавить в таблицы связей связи «молотк»а с id «молоток»а (игнорируя ошибки уникальности).
4. Удалить «молотк».
Пример.
молоток = 1
молотк = 2
таблица связей:
инструмент | устройство
----------------------------
. 1 | 1
. 1 | 3
. 2 | 7
. 2 | 3
После переименования должно получиться:
1 | 1
1 | 3
1 | 7
четвертая строка не прошла проверки уникальности и была выкинута.
Неактивен
логику то я понимаю что куда удалить и куда записать, а вот с синтаксисом хуже, я эта и написал как сказал paulus, но когда добавлял инструмент который уже есть, он удалил все записи из таблицы инструмент | устройство, относящиеся к "молотк" ,а добавил только одну надо
вхоные данные $instr-инструмент $class_классификация id_instr-номер инструмента $ustr_id-номер редактируемого устройства
$res=mysql_query('SELECT * FROM `instr` WHERE `instr` = \''.$instr.'\'');
$numrows=mysql_num_rows($res2);
если в базе нет такойже записи то нумровз=0 и добавляем
if ($numrows==0)
{
mysql_query('INSERT INTO `ingridients` (`id`, `instr`, `class1`, `class2`, `edizm`) VALUES
(\'0\',
\''.$instr.'\',
\''.$class.'\',)');
mysql_query("DELETE FROM instr WHERE id = '".$id_instr."'");
$sel_id_instr=mysql_query("SELECT id FROM instr WHERE instr = '".$instr."'");
$id_instr = mysql_result($sel_id_ingr, 0, 'id');
mysql_query("UPDATE poisk SET id_instr='".$id_instr."' WHERE id_ustr='".$ustr_id."', id_instr='".$$id_instr."'");
}
если нумровз >0 то такой инстурмент уже есть, и надо исправлять
else
{
$del_instr = mysql_query("DELETE FROM instr WHERE id = '".$id_instr."'");
$sel_id_ingr=mysql_query('SELECT * FROM instr WHERE instr = \''.$instr.'\'');
$id_instr = mysql_result($sel_id_instr, 0, 'id');
$upd_poisk=mysql_query("UPDATE poisk SET id_instr='".$id_instr."' WHERE id_ustr='".$ustr_id."' AND id_instr='".$id_instr."'");
}
Неактивен
Обратите внимание: Вы хотите удалить старый молоток. А я предлагаю старый молоток
не удалять. В этом большая разница
Неактивен
какжется, у меня старый молоток не удаляется.
ладно, забью на эту проблему. но там было ещё много других.
Неактивен