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

  • Автор темы I AM
  • Обновлено
  • 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-запросе? Как сказано, скорость должна быть уникальной.

I AM


Рег
23 Jul, 2011

Тем
403760

Постов
400028

Баллов
2418908
  • 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

Тем
81

Постов
203

Баллов
618
  • 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.
 

Seanowemn


Рег
23 Dec, 2013

Тем
62

Постов
201

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

Typepaype


Рег
21 Apr, 2014

Тем
65

Постов
175

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

Hiessomsacefe


Рег
23 Jun, 2011

Тем
75

Постов
209

Баллов
604
  • 12, Jun 2024
  • #6
Если это просто должно быть что-то уникальное, думали ли вы об использовании случайных кодов? Вы можете убрать буквы и использовать только цифры.

 
SET speed = '$speed'


Код (разметка):

  $speed = substr(str_shuffle(str_repeat("0123456789ABCDIFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 15)), 0, 15); 


Код (разметка):
 

ThexyCesevesk98


Рег
19 Feb, 2013

Тем
85

Постов
197

Баллов
662
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно