Как я могу добиться такого рода автоинкрементации в базе данных MySQL - PullRequest
0 голосов
/ 30 августа 2018

У меня есть одна таблица с именем animal.

В этой таблице четыре столбца

  1. Animal
  2. AnimalIndex
  3. Порода
  4. BreedIndex

Все четыре из этих столбцов должны быть primary key Я бы хотел, чтобы они автоматически увеличивали логически, это означает, что получится что-то вроде этого.

| Animal| AI | Breed  | BI |
----------------------------
| dog   | 1  | Akita  | 1  |
| cat   | 2  | Persan | 1  |
| dog   | 1  | Barbet | 2  |
| dog   | 1  | Boxer  | 3  |
| eagle | 3  | Bald   | 1  |

поэтому, если я введу запрос типа

INSERT INTO animal (Animal, Breed) VALUES("dog", "Akita")

мои индексы будут автоматически увеличиваться. Как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Обратите внимание, что решение, объясненное @rmlan, весьма полезно, просто и не зависит от базы данных. Тем не менее, он может не работать в приложениях уровня предприятия, особенно при высокой скорости вставки.

В этих случаях параллельные потоки могут выдавать один и тот же идентификатор.

Для этих случаев я бы предложил использовать триггер.

0 голосов
/ 30 августа 2018

Я хотел бы рассмотреть возможность использования другой модели данных. Возможно, что-то более дружественное для отношений:

Животное:

| id | name  |
--------------
| 1  | dog   |
| 2  | cat   |
| 3  | eagle |

Порода:

| id | name    | breed_idx | animal_id |
---------------------------------------|
| 1  | Akita   | 0         | 1         |
| 2  | Persan  | 0         | 2         |
| 3  | Barbet  | 1         | 1         |
| 4  | Boxer   | 2         | 1         |
| 5  | Bald    | 1         | 3         |

Mysql может легко позаботиться об автоматическом увеличении столбцов id, но поскольку столбец "breed_idx" требует немного логики, вам придется позаботиться об этом самостоятельно. Один из способов, которым вы могли бы сделать это, используя выбор во вставках:

insert into breed (name, breed_idx, animal_id) values('Shar pei', (select count(*) from breed where animal_id = (select id from animal where name = 'dog')), (select id from animal where name = 'dog'));

Обратите внимание, что это создаст столбец с нулевым индексом, как показывают мои данные выше.

Есть и другие способы сделать это (хранимые процедуры или триггеры), но это быстрый и независимый от поставщика баз данных способ достичь того, что (я думаю) вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...