У меня есть таблица MySQL с двумя столбцами int. Первый столбец — auto_increment
. Затем я хочу вставить определенное значение или значение первого столбца во второй столбец.
Например
insert into tab(id,keyy) values (null, id);
Я хочу, чтобы этот оператор вставил строку с идентификатором, являющимся текущим номером AI, и ключом, таким же, как идентификатор. Есть ли простой способ сделать это? Заранее благодарю.
Я попробовал «создать таблицу labels1 (rowId int первичного ключа auto_increment, labelId int as (rowId * 2) persist);» но возникла ошибка «#1901 — Функцию или выражение 'AUTO_INCREMENT' нельзя использовать в предложении GENERATED ALWAYS AS rowId
»
Вот возможные решения: Ошибка «Сгенерированный столбец не может ссылаться на столбец с автоинкрементом» в таблице MySQL и Два столбца с автоинкрементом или автоинкремент и такое же значение в другом столбце.
Также ожидается ошибка. Согласно документации MySQL: «Столбец AUTO_INCREMENT не может использоваться в качестве базового столбца в определении сгенерированного столбца».
Я не могу себе представить, почему кто-то захочет это сделать. Было бы полезно, если бы вы объяснили проблему, для которой, по вашему мнению, это решение.
@prasad_ Спасибо большое. Вторая предложенная вами статья, возможно, ответила на мой вопрос. Предлагалось немедленно вызвать обновление после вставки, использовать функцию max или запросить номер a_i из схемы. Но я все еще надеюсь, что есть другое решение, более простое, чем эти.
@Все, я расскажу о своей настоящей проблеме в ответе ниже.
У меня возникла проблема. У меня есть таблица, в которой хранится «метка» и ее «labelId», а также основной столбец автоматического увеличения, называемый «rowId». При обновлении метки я не обновляю строку, а добавляю новую строку с этим идентификатором метки и новым текстом метки. Когда я добавляю новую метку, я также вставляю новую строку и просто ввожу текст метки, и labelId должен получить значение текущего rowId. Вот и все при добавлении новой метки. Я подумал, что для этого есть простое решение. Спасибо за чтение.
Что показывает select version()
? Может быть очень простое решение
@ysth Это показывает 10.6.19-MariaDB
при вставке вы создаете новую строку, но при обновлении вы создаете новую строку, клонируя все столбцы, кроме столбцов, подлежащих обновлению? ИЗ самой последней строки для этого ярлыка?
@P.Salmon Ах, я хочу добавить обновление строки примерно в 2 столбца: 1 для текста метки и 1 для времени изменения, установленного на текущее время. Вы правы насчет обновления с самой последней строки.
@P.Salmon Столбец labelId — единственный, который я не хочу обновлять. Для моей проблемы этого достаточно
Чтобы отсортировать строки в таблице MySQL по баллам в столбце отметок, показывая сначала самые высокие баллы, вы можете использовать предложение ORDER BY. Для сортировки от самого высокого к самому низкому используйте DESC.
ВЫБЕРИТЕ * ИЗ вашего_названия_таблицы ПОРЯДОК ПО маркировке DESC;
Если вы хотите видеть только первые n строк с наивысшими баллами, вы можете добавить предложение LIMIT.
ВЫБЕРИТЕ * ИЗ вашего_названия_таблицы СОРТИРОВАТЬ ПО маркировке DESC ПРЕДЕЛ n;
Замените n количеством строк, которые вы хотите получить. Это покажет первые n строк с наибольшим количеством баллов.
Спасибо, я прочитал ваш ответ, но спрашиваю об операторе вставки.
Обратите внимание: поскольку вы хотите, чтобы labelId был rowId только при создании новой метки, а не при вставке новой строки, поскольку метка была обновлена, вы не хотите использовать сгенерированный столбец, вы просто хотите, чтобы labelId по умолчанию имел значение rowId.
Вы не можете сделать это с помощью auto_increment, но можете сделать это, если идентификатор установлен из последовательности:
create sequence label_sequence;
create table labels (
rowId int not null primary key default next value for label_sequence,
labelId int not null default rowId
);
Последовательности доступны только в MariaDB, а не в MySQL.
Если вы используете Last_insert_id(), это не сработает; Last_insert_id доступен только для auto_increment.
Спасибо, ваш код мне подходит. Но нормально ли поведение последовательности, когда каждая выполняющая ее команда вставки начинается с нового значения, отличного от старого плюс 1. Первый запуск начинается с 1, второй с 1001, третий с 2001. Я запускаю в phpmyadmin
Это произойдет, если вы каждый раз перезагружаете сервер, он будет начинаться со свежим кэшем 1000. Вы можете отключить кеш для последовательности, см. mariadb.com/kb/en/create-sequence
В MySQL есть функция «Сгенерированные столбцы». Возможно, вы захотите просмотреть документацию и посмотреть, подойдет ли она вам.