MySQL и добавление уникального значения INT, если не используется AUTO_INCREMENT

  • Автор темы matvisyk
  • 67
  • Обновлено
  • 18, May 2024
  • #1
У меня есть таблица MySQL. Я должен иметь возможность добавлять уникальные значения INT для скорости, которые не являются столбцом AUTO_INCREMENT.

 INSERT INTO ki (comp_id, speed, position) VALUES (1, 3, 0)
Код (SQL): Я хочу вставить новые строки.

comp_id всегда равен 1, позиция всегда равна 0, а скорость всегда должна быть MAX(скорость) + 1. Итак, предположим, что я хочу, чтобы скорость была равна 3. Скорость должна быть уникальной.
  CREATE TABLE ki ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT , comp_id INT(10) UNSIGNED NOT NULL , speed INT(4) UNSIGNED NOT NULL DEFAULT 0 , position INT(4) UNSIGNED NOT NULL DEFAULT 0 , PRIMARY KEY (id) , UNIQUE INDEX (comp_id, speed, position) , INDEX (comp_id) , FOREIGN KEY (comp_id) REFERENCES competitions (id) ON DELETE NO ACTION ON UPDATE CASCADE ) ENGINE=InnoDB CHARACTER SET latin1 COLLATE latin1_swedish_ci; 
Код (SQL): если значение 3 уже существует, я бы хотел, чтобы скорость была равна 4. Я не хочу изменять существующие строки. Как я могу сделать это в своем SQL-запросе? Как сказано, скорость должна быть уникальной.

matvisyk


Рег
01 Jan, 2011

Тем
1

Постов
2

Баллов
12
  • 18, May 2024
  • #2
Через триггер?
 
AFTER INSERT ON `table_name`

FOR EACH ROW BEGIN

UPDATE `table_name` SET `speed` = NEW.id WHERE id = NEW.id

END");
Код (разметка): Что-то в этом роде.

По сути, когда вы вставляете новую запись в базу данных, вы запускаете триггер, который обновляет столбец скорости значением из столбца id. Это не проверено, поэтому я не могу гарантировать, что это на 100% синтаксически правильно, но более или менее правильно.
 

keygennn


Рег
01 Jan, 2011

Тем
0

Постов
1

Баллов
1
  • 21, May 2024
  • #3
 
INSERT INTO ki (comp_id, speed, position) VALUES (1, (SELECT MAX(speed) FROM ki K) + 1, 0);
Code (sql): Something like that. Works just fine on 5.7.
 

guts-kombayner


Рег
23 Dec, 2013

Тем
1

Постов
3

Баллов
13
  • 05, Jun 2024
  • #4
Вы не получите ничего. Или MySQL сам обрабатывает нумерацию, иначе в какой-то момент вы определенно можете столкнуться с некоторыми проблемами, связанными с тем, что номер не является уникальным, поскольку его контролируете вы, а не сам сервер.
 

Velsevul


Рег
21 Apr, 2014

Тем
1

Постов
3

Баллов
13
  • 05, Jun 2024
  • #5
ЗАЧЕМ нужны уникальные записи для скорости? Мне кажется, что фактическое значение этого столбца не имеет значения, лишь бы оно было уникальным? Тогда почему бы вам просто не продублировать столбец идентификатора с автоинкрементом или просто ИСПОЛЬЗОВАТЬ вместо этого этот столбец идентификатора?
 

apishops


Рег
23 Jun, 2011

Тем
3

Постов
9

Баллов
39
  • 12, Jun 2024
  • #6
Если это просто должно быть что-то уникальное, думали ли вы об использовании случайных кодов? Вы можете убрать буквы и использовать только цифры.
 
SET speed = '$speed'
Код (разметка):
  $speed = substr(str_shuffle(str_repeat("0123456789ABCDIFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 15)), 0, 15); 
Код (разметка):
 

мельникова марина


Рег
19 Feb, 2013

Тем
1

Постов
3

Баллов
13
Тем
49554
Комментарии
57426
Опыт
552966

Интересно