Как сделать уникальные пары полей? - MySQL

Узнай цену своей работы

Формулировка задачи:

Проектирую БД, встал перед новой для меня задачей, мне необходимо иметь уникальные пары полей. Пусть будет БД с структурой id,uid,msg_id id - auto increment, uid соответственно id пользователя, а msg_id - номер сообщения этого пользователя. Я вполне понимаю что достаточно и двух полей, но мне необходимо иметь возможность вывести номер конкретного сообщения пользователя при необходимости, а значит каждое сообщение должно иметь свой УНИКАЛЬНЫЙ последовательный номер. И при удалении сообщения (а точнее присвоении в таблице ему статуса del), следующее сообщение должно иметь уже следующий номер. Как сделать так, что бы в записи с одинаковым uid не могло быть более одного одинакового msg_id? Unique, на сколько я понимаю, не позволяет иметь одинаковых записей в определенном поле вообще. То есть даже записи с разным uid, но одинаковым msg_id (например 1), не смогут существовать. Нужно мне это потому что при создании записи, я буду записывать в msg_id результат запроса
Листинг программы
  1. (SELECT `msg_id` FROM `table` WHERE `uid`=$uid)+1
И считаю что при определенных условиях возможна запись 2х(а может и более) сообщений с одинаковым msg_id, что в моей ситуации совершенно недопустимо. Если вы считаете что я как-то неправильно инкримерирую +1 в поле msg_id, можете сказать об этом. Если в вашем решении будет невозможно создать более одной записи с одним и тем же msg_id - это будет ответом на мой вопрос. p.s. Сейчас подумал о том что бы при создании записи увеличивать msg_id иначе, как-нибудь вроде "++", но на сколько я понимаю это не сработает.

Решение задачи: «Как сделать уникальные пары полей?»

textual
Листинг программы
  1. mysql> create table tst_isam (
  2. -> uid int not null,
  3. -> msg_id int auto_increment,
  4. -> primary key (uid, msg_id)
  5. -> ) engine = myisam default character set = cp1251;
  6. Query OK, 0 rows affected (0.00 sec)
  7.  
  8. mysql> insert into tst_isam(uid) values
  9. -> (1), (1), (1), (3), (4), (1), (2), (3), (2), (1), (2), (3), (1), (2), (3);
  10. Query OK, 15 rows affected (0.00 sec)
  11. Records: 15 Duplicates: 0 Warnings: 0
  12.  
  13. mysql> -- ранее только одно значение для uid = 4 и будет добавлено (msg_id = 6)
  14. mysql> insert into tst_isam values (4, 6);
  15. Query OK, 1 row affected (0.00 sec)
  16.  
  17. mysql> -- но теперь новое значение будет увеличено от последнего добавленного т.е. msg_id будет равно 7
  18. mysql> insert into tst_isam(uid) values (4);
  19. Query OK, 1 row affected (0.00 sec)
  20.  
  21. mysql> select * from tst_isam order by uid, msg_id;
  22. +-----+--------+
  23. | uid | msg_id |
  24. +-----+--------+
  25. | 1 | 1 |
  26. | 1 | 2 |
  27. | 1 | 3 |
  28. | 1 | 4 |
  29. | 1 | 5 |
  30. | 1 | 6 |
  31. | 2 | 1 |
  32. | 2 | 2 |
  33. | 2 | 3 |
  34. | 2 | 4 |
  35. | 3 | 1 |
  36. | 3 | 2 |
  37. | 3 | 3 |
  38. | 3 | 4 |
  39. | 4 | 1 |
  40. | 4 | 6 |
  41. | 4 | 7 |
  42. +-----+--------+
  43. 17 rows in set (0.00 sec)
  44.  
  45. mysql> -- и попробуем добавить уже существующую запись (id = 4, msg_id = 7)
  46. mysql> insert into tst_isam values (4, 7);
  47. ERROR 1062 (23000): Duplicate entry '4-7' for key 'PRIMARY'
  48. mysql> -- так для innodb не работает :(
  49. mysql> create table tst_innodb (
  50. -> uid int not null,
  51. -> msg_id int auto_increment,
  52. -> primary key (uid, msg_id)
  53. -> ) engine = iy (msg_id, uid)
  54. -> ) engine = innodb default character set = cp1251;
  55. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'msg_id, uid)
  56. ) engine = innodb default character set = cp1251' at line 5
  57. mysql> -- а вот так для innodb работает :)
  58. mysql> create table tst_innodb (
  59. -> uid int not null,
  60. -> msg_id int auto_increment,
  61. -> primary key (msg_id, uid)
  62. -> ) engine = innodb default character set = cp1251;
  63. Query OK, 0 rows affected (0.00 sec)

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут