|
|
|
| В таблице есть уникальный индекс, поэтому при добавлении некоторых записей - они в таблицу добавляться не должны, но надо как-то получать айди уже существующей записи для таблицы-связки...
Если бы значение было уникальным, то после запроса айди можно было бы получить через mysql_insert_id()... | |
|
|
|
|
|
|
|
для: itica
(19.07.2009 в 18:11)
| | Так, а запрос с просмотром уже не устраивает? :)
SELECT `id` FROM table WHERE pole='ТО ЧТО УЖЕ ЕСТЬ' LIMIT 1
|
| |
|
|
|
|
|
|
|
для: virtus1k
(20.07.2009 в 10:08)
| | LIMIT 1 зачем?
Ключ уникальный по условию задачи. | |
|
|
|
|
|
|
|
для: virtus1k
(20.07.2009 в 10:08)
| | Дело в том что записей добавляться будет каждый раз около сотни, и если я буду делать такой поиск (а уникальные поля текстовые) по многомиллионной базе, то не думаю что это будет быстро... поэтому хотелось бы как-то решить такую задача более просто. | |
|
|
|
|
|
|
|
для: itica
(20.07.2009 в 14:13)
| | Поиск по уникальному индексу всяко быстрее, чем добавление строки . | |
|
|
|
|
|
|
|
для: Trianon
(20.07.2009 в 14:18)
| | Хм.. я может не так объяснил - вообще я хотел сделать составной инсерт (тоесть не отдельный запрос для каждой строки - а сразу одним запросом) - и айди от каждой записи при этом надо добавлять в другую таблицу (если запись существует - то айди существующей записи), причём если мне надо добавить 100 записей, скрипт не должен работать дольше 1-2 секунд на многомиллионной базе.
Структуру самой базы я кратко описывал здесь: http://softtime.ru/forum/read.php?id_forum=3&id_theme=66667&page=1 | |
|
|
|
|
|
|
|
для: itica
(20.07.2009 в 14:31)
| | Тогда приводите запрос чтоли... | |
|
|
|
|
|
|
|
для: Trianon
(20.07.2009 в 14:37)
| |
foreach ($results as $result)
{
$insert_values .= "('','".$request['id']."','".$result['name']."','".$result['surname']."','".$result['text']."'),";
}
$insert_values = trim($insert_values, ",");
$insert = mysql_query("INSERT INTO `mp3` (`id`,`request`,`name`,`surname`,`text`) VALUES".$insert_values) or die(mysql_error());
|
В принципе сам запрос можно и перестроить, но я думаю возможно как-то может средствами MySQL сделать составной запрос - и добавить айди вставленных записей в другую таблицу...
`name`,`surname`,`text` - составной уникальный индекс | |
|
|
|
|
|
|
|
для: itica
(20.07.2009 в 15:28)
| | В INSERT есть методика ON DUPLICATE KEY UPDATE
Там можно указать, какие строки менялись.
INSERT ... SELECT будет явно предпочтительней. | |
|
|
|
|
|
|
|
для: Trianon
(20.07.2009 в 15:36)
| | ON DUPLICATE KEY UPDATE - обновит первичный ключ, но ведь если с этим первичным ключом УЖЕ была запись в другой таблице то целостность данных нарушиться (так как в другой таблице первичному ключу соответствует чужой ключ - то запись будет удалена, а необходимо чтобы и старая запись осталась во второй таблице (с правильным ключом) и новая добавилась. | |
|
|
|
|
|
|
|
для: itica
(20.07.2009 в 16:02)
| | Чего ради он обновит первичный ключ?
Запись обновит - да. Ну так ведь не всю же?
В терминах первая таблица, вторая таблица рассуждать тяжело.
Может всё ж по именам? Желательно не совсем от балды. | |
|
|
|
|
|
|
|
для: Trianon
(20.07.2009 в 16:10)
| | То есть правильно ли я понимаю - что он обновит запись и после запроса мы сможем получить первичный ключ обновлённой записи через mysql_insert_id()? | |
|
|
|
|
|
|
|
для: itica
(20.07.2009 в 16:14)
| | Нет. Но мы сможем получить её (или даже набор таких записей) через те сигнальные поля , которые оказались обновлены.
Понятно, что если такого поля нет, его придется добавить. | |
|
|
|
|
|
|
|
для: Trianon
(20.07.2009 в 16:16)
| | Ммм... что-то я совсем запутался... не могу догнать весь алгоритм что будет происходить с того момента как у меня появится куча строк для добавления до того момента как строки будут добавлены (если их нет) и на них будет ссылка из второй таблицы... | |
|
|
|
|
|
|
|
для: itica
(20.07.2009 в 16:23)
| | Так я поэтому и спросил у Вас текст запроса.
До конкретного запроса, Вы похоже, еще не допилили. | |
|
|
|
|
|
|
|
для: Trianon
(20.07.2009 в 16:25)
| | Допустим у нас есть для начала такой запрос:
INSERT INTO `table1` (`id`,`name`,`surname`,`text`) VALUES ('','Имя1','Фамилия1','Текст1'),('','Имя2','Фамилия2','Текст2');
|
В таблице table1 - уже есть запись '1','Имя1','Фамилия1','Текст1'
В таблице table2 - есть запись с соответствием:
---------------------------------
id_request id_answer
---------------------------------
1 1
При выполнении запроса (запросов) должны получить что в table1 появится запись '2','Имя2','Фамилия2','Текст2'
А table2 превратится в:
---------------------------------
id_request id_answer
---------------------------------
1 1
2 1
2 2
---
Это то что необходимо сделать было.
А вот с чего начать - как изменить первый запрос с использованием ON DUPLICATE KEY UPDATE и что нам это даст никак не пойму... даже если будет какое-то доп.поле, которое будет менять значение... | |
|
|
|
|
|
|
|
для: itica
(20.07.2009 в 16:55)
| | Одним INSERT-запросом можно добавить записи лишь в одну таблицу.
Если, конечно, не применять триггеры. | |
|
|
|
|
|
|
|
для: Trianon
(20.07.2009 в 17:18)
| | Поэтому я пишу запрос-запросы, я чисто алгоритмически даже не могу понять как осуществить то что надо без кучи запросов (ну или использую 2-3 запроса, не загоняя их в цикл. | |
|
|
|
|
|
|
|
для: itica
(20.07.2009 в 18:55)
| | Согласно какой логике в table2 появились записи (2,1) и (2, 2) - я не понял. | |
|
|
|
|
|
|
|
для: Trianon
(20.07.2009 в 19:01)
| | id_request - это номер запроса, его мы опускаем (можно только сказать что для каждого запроса может быть много ответов).
id_answer - это id записи которые и надо вставить.
Тоесть раньше для запроса 1 нашлась одна запись (ищется не по базе). Потом создали запрос 2 - для него нашлось 2 записи, но при этом одна из них равна по уникальному индексу записи которая нашлась по запросу 1 и уже находится в базе и имеет id=1, поэтому в table2 появляется запись где id запроса = 2, а id записи = 1. Затем в первую таблицу вставляется вторая запись, которая уникальна и еq присваивается id=2, соответственно во вторую таблицу заносится соответствие id_request = 2, id_answer = 2. | |
|
|
|
|
|
|
|
для: itica
(20.07.2009 в 19:14)
| | То есть в первую таблицу никакие записи добавлять не нужно? | |
|
|
|
|
|
|
|
для: Trianon
(20.07.2009 в 19:18)
| | Затем в первую таблицу вставляется вторая запись, которая уникальна и еq присваивается id=2, соответственно во вторую таблицу заносится соответствие id_request = 2, id_answer = 2.
---
Или Вы про таблицу один из темы:
http://softtime.ru/forum/read.php?id_forum=3&id_theme=66667&page=1
Если про неё то ненадо - там уже всё готово, непонятка только с таблицами 2и3. | |
|
|
|
|
|
|
|
для: itica
(20.07.2009 в 19:22)
| | я про table1 | |
|
|
|
|
|
|
|
для: Trianon
(20.07.2009 в 19:28)
| | Ну туда (table1) вставляются как раз записи у которых уникальный индекс.
Если она по индексу не проходит для вставки, то вставляется только в table2 соответствие запрос-запись которая равна по индексу той, которую вставить не удалось, если же запись уникальна и вставилась - то table2 вставляется опять же соответствие запрос-и ид только что вставленной записи... | |
|
|
|