автоинкремент как первичный ключ, вызывающий дублирование записей

#php #mysql #primary-key #auto-increment

#php #mysql #primary-key #автоинкремент

Вопрос:

Я хочу, чтобы идентификатор и имя были первичным ключом для моей таблицы. Я хочу увеличивать идентификатор с каждой вставкой, поэтому я установил для него значение auto_increment. Проблема в том, что когда я вставляю в таблицу новую запись с тем же именем, она вставляет ее с новым идентификатором, и появляются повторяющиеся записи с тем же именем и разными идентификаторами. Я не хочу заранее искать таблицу, чтобы увидеть, есть ли какая-либо запись заранее. Пожалуйста, помогите мне, как исправить эту проблему.

Ответ №1:

Я думаю, вы сделали что-то вроде этого

 CREATE TABLE table1
   id unsigned integer autoincrement,
   name varchar,
   ....
   primary key (id,name)
  

Этот первичный ключ не выбирает уникальное имя, потому что идентификатор автоинкремента всегда будет делать ключ в целом уникальным, даже с повторяющимися name полями.

Также обратите внимание, что длинные первичные ключи — это плохая идея, чем длиннее ваш PK, тем медленнее будут выполняться вставки и выборки. Это особенно плохо для InnoDB, потому что PK включен в каждый вторичный ключ, раздувая ваши индексные файлы.

Измените его на это

 CREATE TABLE table1
   id unsigned integer autoincrement primary key,
   name varchar,
   ....
   unique index `name`(name)
  

Комментарии:

1. спасибо за совет… Не знал об этом .. Об этом тоже позаботимся.. Еще раз спасибо..

Ответ №2:

Если вы хотите, чтобы он был уникальным по имени, вам нужно добавить уникальный индекс в поле name, а затем вы можете использовать синтаксис mysql для on duplicate key: ссылка mysql для on duplicate key

Ответ №3:

Вы могли бы применить уникальный индекс к своему полю имени или, если вы сохраняете людей, разрешить дублирование имен.

Ответ №4:

Добавьте UNIQUE( your_column_name ), который вы должны заменить your_column_name на столбец в вашей базе данных.

Комментарии:

1. Это сработает, но оператору также необходимо изменить определение первичного ключа, если он хочет, чтобы его запросы не были медленными.