Mysql
 sql >> база данни >  >> RDS >> Mysql

циклично автоматично нарастване за всяка ключова стойност

MyISAM поддържа това поведение. Създайте първичен ключ с две колони и направете втори автоматично увеличаване на колоната. Ще започне отначало за всяка отделна стойност в първата колона.

CREATE TABLE t (i INT, j INT AUTO_INCREMENT, PRIMARY KEY (i,j)) ENGINE=MyISAM;
INSERT INTO t (i) VALUES (1), (1), (2), (2), (1), (3);
SELECT * FROM t; 

+---+---+
| i | j |
+---+---+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
+---+---+

Но ако се замислите, това е безопасно за нишки само в машина за съхранение, която прави заключване на ниво таблица за оператори INSERT. Тъй като INSERT трябва да търси в други редове в таблицата, за да намери максималния j стойност за същия i стойност. Ако други хора извършват INSERT едновременно, това създава състояние на състезание.

По този начин, зависимостта от MyISAM, която прави заключване на ниво таблица на INSERT.

Вижте тази препратка в ръководството:http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html под раздела Бележки на MyISAM .

Има много основателни причини да не използвате MyISAM. Решаващият фактор за мен е склонността на MyISAM да поврежда данни.

Re your comment:

InnoDB не поддържа описаното по-горе поведение на нарастване на група. Можете да направите първичен ключ с много колони, но грешката, която получавате, е, защото InnoDB изисква колоната за автоматично нарастване да бъде първата колона в ключ на таблицата (не е задължително да е първичен ключ)

Независимо от позицията на колоната за автоматично нарастване в ключа с няколко колони, тя се увеличава само когато я използвате с InnoDB; не номерира записи за отделна стойност в друга колона.

За да направите това с InnoDB таблица, ще трябва да заключите таблицата изрично за продължителността на INSERT, за да избегнете условия на състезание. Бихте направили своя собствена заявка SELECT за максималната стойност в групата, в която вмъквате. След това въведете тази стойност + 1.

По принцип трябва да заобиколите функцията за автоматично нарастване и да посочите стойности, вместо да ги генерирате автоматично.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Актуализирайте първия ред mysql php

  2. Коментари относно проблем с дизайна на базата данни с много таблици

  3. Bind_param трудности

  4. Коя е най-добрата дефиниция на поле за съхраняване на .NET десетичен знак в MySQL?

  5. Как да добавя префикс на всички таблици в mysql