Возможно ли иметь столбец AUTO_INCREMENT, который разрешает дубликаты? - PullRequest
2 голосов
/ 28 мая 2009

У меня есть таблица с полем AUTO_INCREMENT. В настоящее время это также ПЕРВИЧНЫЙ КЛЮЧ.

Однако бывают ситуации, когда мне нужен этот столбец AUTO_INCREMENT, чтобы разрешить дублирование. Другими словами - две разные строки могут иметь одинаковое значение внутри столбца AUTO_INCREMENT. Это будет означать наличие поля AUTO_INCREMENT, которое не является ПЕРВИЧНЫМ КЛЮЧОМ.

Возможно ли это?

Я предполагаю, что это не так, так как всякий раз, когда я пытаюсь это сделать, я получаю эту ошибку:

ERROR 1075 (42000) at line 130: Incorrect table definition; there can be only one auto column and it must be defined as a key

Мне нравится иметь поле AUTO_INCREMENT, потому что оно избавляет меня от необходимости вручную сохранять / увеличивать отдельный счетчик в другом месте в моей базе данных. Я могу просто вставить в таблицу и взять значение, которое было вставлено. Однако, если у меня не может быть дубликатов, похоже, что я застряну с использованием отдельной таблицы для отслеживания и ручного увеличения этого поля.

ОБНОВЛЕНИЕ: В качестве быстрого пояснения, я уже знаком с группированием поля AUTO_INCREMENT с другим ключом, , как описано здесь . Давайте предположим, что это решение не будет работать из-за других ограничений в базе данных.

Ответы [ 2 ]

5 голосов
/ 28 мая 2009

Поле автоинкремента в MySQL должно быть частью ключа (т.е. индекса), но не обязательно частью первичного ключа или уникального ключа.

CREATE TABLE mytable (
  id   INT PRIMARY KEY,
  otto INT AUTO_INCREMENT,
  KEY (otto)
);

-- allow the auto-increment to generate a value

INSERT INTO mytable (id, otto) VALUES (123, DEFAULT);

SELECT * FROM mytable;

> 123, 1

-- specify a duplicate value, overriding the auto-increment mechanism

INSERT INTO mytable (id, otto) VALUES (456, 1); 

SELECT * FROM mytable;

> 123, 1
> 456, 1

-- allow the auto-increment to generate another value

INSERT INTO mytable (id, otto) VALUES (789, DEFAULT);

SELECT * FROM mytable;

> 123, 1
> 456, 1
> 789, 2
2 голосов
/ 28 мая 2009

Похоже, «подзадача» - это таблица, на которую «задача» имеет ссылку FK. То есть, если подзадачи используются повторно.

OTOH, если задача может иметь много подзадач, и подзадача может быть связана с более чем одной задачей, тогда вы смотрите на многие-во-многих в отдельной таблице.

в любом случае я не думаю, что вы хотите, чтобы БД автоматически генерировала эти 'связанные идентификаторы'.

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