В общем помогите, а то что то гугл мне ничего не сказал.. Есть у меня к примеру табличка 1. ИД - автоинкрементальный столбец 2. Имя - которое должно быть таким "новое_имя" + ИД, то есть слово плюс текущее значение автоикремента строки.. Как правильно это сделать? 1. вариант с select max - не очень правильный.. потому что если добавили новую строку с ИД 5 и удалили ее сразу то следующий автоинкрементный номер будет будет уже 6.. а max выдаст 4 к примеру.. 2. Рассматриваю вариант с добавлением строки а потом сразу update - но мне кажется что это костыль... есть что то более умное?)) 3. Рассматриваю вот такой еще вариант show table status like 'table' - но не знаю насколько он правильный.. Спасибо)
мне кажется правильно не придумывать какое то случайно ИМЯ а потом его переименовывать.. а сразу давать правильное имя..
может не нужно такое имя давать? ведь его всегда можно вычислить как CONCAT(name,"_",id) AS new_name что 1, что 3 - не гарантируют вставки между этими запросами и вставкой нового элемента потому 2 - более верный вариант...
да тут надо что бы такие имена в базе хранились. . тут получается что происходит авторегистрация, и отображаемое имя будет другое.. а это должно быть как бы служебное что ли))
Если хочешь обойтись 1 запросом и иметь "уникальное" служебное имя я бы посоветовал использовать PHP: uniqid()
в народе сказывают, что шляпа это полная, и костыль дремучий, но вот ссылка где глаголят о реализации сего. А вообще, если тебе где-то нужно вывести имя_id то вполне можно сделать так: PHP: echo $row['name'].'_'.$row['id']; и не закладывать какулю в админку, которая вдруг сломается при переезде, или типа того. --- Добавлено --- чем проще, тем надежнее)
Все еще не видно аргументов за такую реализацию. ID уникальный сам по себе и есть служебное имя пользователя.
Не подходит, данные операции выдают информацию после добавления в базу. А ОП хочет узнать до. @Алекс8 этот подход плох, вообще сам по себе. ID на то и ID. А при вычислении следующего ты можешь выхватить race condition. Попробуй резервировать место. В лучшем случае update, в худшем - кроном выпилишь все тестовые.
записи будут добавлять 2-3 штуки в сутки.. так что врядли поймаю.. уже сделал по варианту 3.. но вот сейчас переделываю по 2 варианту)
Ради интереса попробовал следующие методы (СУБД MySQL): Триггер на AFTER INSERT — запрос на создание не выполняется, потому что обновление вставленной строки запрещено Сделал триггер на BEFORE INSERT Код (Text): DROP TRIGGER IF EXISTS trigger1; CREATE TRIGGER trigger1 BEFORE INSERT ON table1 FOR EACH row BEGIN SET @auto_id := ( SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='table1' AND TABLE_SCHEMA=DATABASE() ); SET new.name= concat(new.name, '_', @auto_id); END; Работает, т.е. обновляет столбец name, но странно: Код (Text): INSERT INTO table1(NAME) VALUES('test'), ('preved'), ('medved'); Код (Text): SELECT * FROM table1; +----+----------+------+ | id | name | desc | +----+----------+------+ | 1 | test_1 | NULL | | 2 | preved_4 | NULL | | 3 | medved_4 | NULL | +----+----------+------+ Добавил генерируемый столбец (ссылка): Код (Text): ALTER TABLE table1 ADD COLUMN total_col2 VARCHAR(100) AS (concat(`name`, '_', `id`)); Работает как нужно: Код (Text): TRUNCATE table1; INSERT INTO table1(NAME) VALUES('test'), ('preved'), ('medved'); SELECT * FROM table1; +----+----------+------+-----------+------------+ | id | name | desc | total_col | total_col2 | +----+----------+------+-----------+------------+ | 1 | test_1 | NULL | 2 | test_1_1 | | 2 | preved_4 | NULL | 4 | preved_4_2 | | 3 | medved_4 | NULL | 6 | medved_4_3 | +----+----------+------+-----------+------------+ Чехарда с номерами в total_col2 из-за того, что триггер всё ещё работает.
по хорошему, тебе не должно хотеться этого но если таки хочется, то вариант с update единственно верный. можешь, кстати, обойтись голым mysql, в нём есть функция last_insert_id() Код (Text): UPDATE table1 SET stringfield = CONCAT('xуйнанэ_', id) WHERE id = last_insert_id() --- Добавлено --- если у тебя скрипт гарантированно будет в паре с нужной версией mysql, то да, генерируемый столбец это решение. но помоему проще эту хотелку решать в момент выборки данных в SELECT или вообще на стороне PHP при заполнении шаблона ))) то есть не создавать вообще лишнего поля.