![]() |
Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
Имеется таблица с полями `Фамилия`, `Имя`.
Требуется создать в ней поле `Отчество` и заполнить его значениями, соответствующими уже имеющимся значениям строк (фамилия, имя), которых несколько сотен.
Как составить запрос?
P.S. Если такой вопрос обсуждался - извиняюсь. Не знаю, как сформулировать соответствующий поиск.
Неактивен
По первому пункту смотрите ALTER TABLE `table` ADD COLUMN. По второму не понятно, что значит "соответствующими значениями". Можно заполнить, например, соответствующими фамилиями и именами через пробел, чтобы не переспрашивать.
Неактивен
estic написал:
По первому пункту смотрите ALTER TABLE `table` ADD COLUMN. По второму не понятно, что значит "соответствующими значениями". Можно заполнить, например, соответствующими фамилиями и именами через пробел, чтобы не переспрашивать.
С созданием поля проблем нет - упомянул на тот случай, если при создании, вдруг, в моём случае требуется не стандартный запрос.
Есть таблица 'Peopl':
+---------+-------+
| ln | fn |
+---------+-------+
| Ivanov | Ivan |
| Petrov | Petr |
| Sidorov | Sidor |
+---------+-------+
Требуется добавить поле 'p', которое затем заполнить значениями отчеств.
Создаю поле, но затем, при выполнении следующего запроса:
mysql> INSERT Peopl (p)
-> VALUES
-> ('Ivanovich'),
-> ('Petrovicn');
таблица принимает такой вид:
+---------+-------+-----------+
| ln | fn | p |
+---------+-------+-----------+
| Ivanov | Ivan | NULL |
| Petrov | Petr | NULL |
| Sidorov | Sidor | NULL |
| NULL | NULL | Ivanovich |
| NULL | NULL | Petrovicn |
+---------+-------+-----------+
А мне требуется, чтобы отчества заполняли поле с первой строки, продолжая уже имеющиеся строки с фамилией и именем.
Неактивен
чтобы заполнить все три поля нужен запрос
Неактивен
Римович написал:
Требуется добавить поле 'p', которое затем заполнить значениями отчеств.
Задача становится еще более странной, чем я предположил в начале.
Можете обновлять по одной записи, используя WHERE `p` IS NULL LIMIT 1, раз не разжились нормальным идентификатором ![]()
Неактивен
да, ID целочисленного явно не хватает
Неактивен
Да, если бы были идентификаторы, можно было использовать INSERT ... ON DUPLICATE KEY UPDATE ![]()
Со значениями (1, 'Ivanovich'), (2, 'Petrovich'), etc.
Неактивен
По одной записи я, конечно, могу обновлять... Но, как я указал в первичном условии, записей сотни.
Простого решения, понимаю, нет. Конечно, в БД записи не упорядочены, но выводятся же в определённом постоянном порядке, а не рандомно при каждом обращении...
Полагал, что используя логику этого порядка, внесённые значения дополнительного столбца могли бы размещаться в этом же порядке напротив уже внесённых в строки значений...
Отредактированно Римович (25.01.2023 23:52:47)
Неактивен
Нету понимания, как Вы хотите заполнять поле Отчество, имея Имя и фамилию. Эти данные ведь надо откуда-то брать.
Неактивен
deadka написал:
Нету понимания, как Вы хотите заполнять поле Отчество, имея Имя и фамилию. Эти данные ведь надо откуда-то брать.
Какие данные? Отчества? Я их вношу в запрос последовательно, в соответствии с порядком строк Фамилия_Имя, выводимых SELECT * FROM Peopl.
Далее - см. предыдущее сообщение. )))
Как вариант: добавить поле id INT PRIMARY KEY AUTO_INCREMENT, а потом
estic написал:
...использовать INSERT ... ON DUPLICATE KEY UPDATE
![]()
Со значениями (1, 'Ivanovich'), (2, 'Petrovich'), etc.
?
Неактивен
Римович написал:
По одной записи я, конечно, могу обновлять... Но, как я указал в первичном условии, записей сотни.
Простого решения, понимаю, нет. Конечно, в БД записи не упорядочены, но выводятся же в определённом постоянном порядке, а не рандомно при каждом обращении...
Полагал, что используя логику этого порядка, внесённые значения дополнительного столбца могли бы размещаться в этом же порядке напротив уже внесённых в строки значений...
Вот тут ещё товарищи на мой вопрос:
"По "классике", записи в таблице не упорядоченны, верно? Но есть некий принцип, по которому они выводятся при просмотре таблицы в определённой последовательности, если такая последовательность не задана жёстко запросом.
Или следует ожидать, что последовательность расположения строк будет рандомно меняться от раза к разу при вызове таблицы?"
меня просветили - если кому из начинающих интересно будет:
Gluck99: "Нет никакого принципа, смотрите стандарт SQL. На конкретной БД в определенной версии сервера и на конкретной машине последовательность может быть одной. В другой БД, на другой версии и на другом диске последовательность будет иной. Плюс есть внутренняя логика оптимизатора, который упорядочивает записи таким образом, каким считает нужным в конкретной ситуации.
Это не означает, что каждый раз выполняя SELECT, записи будут рандомно менять положение. Обычно (но необязательно) они остаются в том же порядке. Суть в том, что в других условиях порядок может быть другим. И опять-таки, он не рандомный, он сложно предсказуемый. И эта сложность (и ненужность гадания на кофейной гуще) создаёт некоторый эффект как бы рандомности."
Ludwig Valentin: "Если не id c автоинкрементом, то можно добавить столбец с последней датой.
Но если вставляется много записей в секунду, такой подход тоже не годится.
Поэтому - id с автоинкрементом."
Спасибо всем принявшим участие в обсуждении!
Неактивен
Если таблица InnoDB, то данные будут считываться и отдаваться согласно кластерному индексу, подряд то есть.
Но гарантий этого никто не даст. По стандарту sql - если нет order by, то порядок не гарантируется. точка.
Так что да, лучше целочисленный id ну или да, игрища с датой/временем. автоинкрементный id - универсальное решение.
Неактивен