Два первичных ключа и автоинкремент - PullRequest
1 голос
/ 09 января 2012

У меня есть таблица MySQL с двумя полями в качестве первичного ключа (идентификатор и учетная запись), идентификатор имеет AUTO_INCREMENT.Это приводит к следующей таблице MySQL:

 ID    |  Account
------------------
 1     |     1
 2     |     1
 3     |     2
 4     |     3

Однако я ожидал следующий результат (перезапустите AUTO_INCREMENT для каждой учетной записи):

 ID    |  Account
------------------
 1     |     1
 2     |     1
 1     |     2
 1     |     3

Что не так в моей конфигурации?Как я могу это исправить?

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 января 2012

Функциональность, которую вы описываете, возможна только с MyISAM движком. Вам необходимо указать оператор CREATE TABLE следующим образом:

CREATE TABLE your_table ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, account_id INT UNSIGNED NOT NULL, PRIMARY KEY(account_id, id) ) ENGINE = MyISAM;

0 голосов
/ 05 мая 2014

Если вы используете механизм innoDB, вы можете использовать триггер, подобный следующему:

CREATE TRIGGER `your_table_before_ins_trig` BEFORE INSERT ON `your_table`
FOR EACH ROW 
begin
declare next_id int unsigned default 1;

  -- get the next ID for your Account Number
  select max(ID) + 1 into next_id from your_table where Account = new.Account;

  -- if there is no Account number yet, set the ID to 1 by default
  IF next_id IS NULL THEN SET next_id = 1; END IF;

  set new.ID= next_id; 
end#

Примечание!ваш столбец-разделитель # в приведенном выше выражении sql!

Это решение работает для такой таблицы, как ваша, если вы создаете ее без какой-либо функции auto_increment, например:

CREATE TABLE IF NOT EXISTS `your_table` (
  `ID` int(11) NOT NULL,
  `Account` int(11) NOT NULL,
  PRIMARY KEY (`ID`,`Account`)
);

Теперь вы можете вставить свои значения следующим образом:

INSERT INTO your_table (`Account`) VALUES (1);
INSERT INTO your_table (`Account`, `ID`) VALUES (1, 5);
INSERT INTO your_table (`Account`) VALUES (2);
INSERT INTO your_table (`Account`, `ID`) VALUES (3, 10205);

Это приведет к этому:

 ID    |  Account
------------------
 1     |     1
 2     |     1
 1     |     2
 1     |     3
...