Как я могу вставить данные без указания значения для первичного ключа без автоинкремента? - PullRequest
3 голосов
/ 13 ноября 2009

У меня есть эта таблица:

CREATE TABLE Persons
(
P_Id int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Address varchar(255),
City varchar(255),
PRIMARY KEY (P_Id)
)


1. insert into persons values (1, 'John', 'Smith', 'LA', 'LA');
2. insert into persons (p_id, lastname, firstname, address, city) values  (2, 'John', 'Smith', 'LV', 'LV');

Как вставить данные в таблицу без указания значения для первичного ключа (первичный ключ не имеет атрибута "auto_increment").

Я пытался с:

  1. вставить в значения личности («Джон», «Смит», «ЛА», «ЛА»);
  2. вставить в значения личности (ноль, 'Джон', 'Смит', 'LA', 'LA');
  3. вставить в персонализированные значения (auto, 'John', 'Smith', 'LA', 'LA');

но не повезло

Ответы [ 4 ]

6 голосов
/ 13 ноября 2009

Первичные ключи не могут быть нулевыми, и если вы не установите для них автоматическое приращение, то как MySQL узнает, что вы хотите поместить в таблицу? Вам нужно либо указать идентификатор (возможно, выбрав MAX (P_Id) и добавить к нему 1), либо установить его на автоматическое увеличение.

Хотя простое добавление поля автоинкремента определенно является лучшим подходом, вы можете попробовать что-то вроде этого:

INSERT INTO Persons (P_Id, FirstName, LastName, Address, City)
VALUES ((SELECT MAX(P_Id) + 1 FROM Persons), 'John', 'Smith', 'LA', 'LA');

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

0 голосов
/ 31 января 2017

При загрузке строки в таблицу с автоинкрементом вы можете указать значение при условии, что это значение НЕ меньше, чем самое высокое значение в этом ключе. Это работает так же, как уникальный ключ, и выдает ошибку, как если бы он был дубликатом. В противном случае он будет обрабатывать новое загруженное значение как новое наибольшее значение для этого ключа.

Мне очень любопытно узнать, почему кто-то захочет использовать первичный ключ без использования автоинкремента. Автоинкремент обеспечивает самый элегантный способ избежать дублирования данных в любой таблице. Если остальные данные совпадают с другой строкой в ​​этой таблице, их можно идентифицировать и исправить / удалить. При использовании в сочетании с другой строкой, которая является уникальным ключом (для перехвата любых дубликатов), таблица становится очень надежной.

ianm

0 голосов
/ 13 ноября 2009
 Select p_id+1 From Person OrderBy p_id desc limit 1;
0 голосов
/ 13 ноября 2009

Я видел, как это реализовано как

  • Значение DEFAULT в столбце PK (скажем, -9999)
  • Таблица, содержащая значение Current_PK
  • Триггер INSERT, который изменяет этот PK с -9999 на Current_PK и увеличивает Current_PK

Другой способ, который я видел, - это получить МАКС из таблицы, увеличить его и поместить в новую строку.

Я должен сказать, что оба эти метода вызывали некорректные данные, вызывали блокировку и блокировку и снижали производительность.

В вашем случае я не вижу другого способа, кроме как указать значение для PK.

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