Каким должен быть мой оператор INSERT INTO для GENERATED DEFAULT AS IDENTITY? - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь использовать ключ GENERATED BY DEFAULT AS IDENTITY для идентификаторов моих записей для моих таблиц, потому что пользователь должен сам зарегистрироваться, а пользователь не должен иметь возможность выбирать собственный идентификатор записи. Поэтому я решил использовать GENERATED DEFAULT как IDENTITY, но я не знаю, как написать свои операторы INSERT.

Это моя таблица пользователей:

CREATE TABLE USER
(
   ID_USER INT NOT NULL GENERATED BY DEFAULT AS IDENTITY,
   USERNAME VARCHAR(20) UNIQUE NOT NULL,
   FORENAME VARCHAR(20) NOT NULL,
   SURNAME VARCHAR(20) NOT NULL,
   PASSWORD VARCHAR(10) NOT NULL,
   USER_TYPE INT NOT NULL,
   PRIMARY KEY(ID_USER),
   FOREIGN KEY (USER_TYPE) REFERENCES USER_TYPES(ID_TYPE)
);

и пользователям будет разрешено зарегистрироваться.

Это - это то, что я использую для своей базы данных

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Если в таблице есть столбец GENERATED DEFAULT AS IDENTITY, это означает, что вы можете вставить значение в этот столбец, если хотите, но у вас нет значения to.Итак, в вашей вставке вы могли бы вместо этого написать

INSERT INTO ARTIST (ORIGIN,ARTIST_NAME) VALUES ('USA','Nirvana');

Для справки: https://www.ibm.com/support/knowledgecenter/en/SSEPEK_11.0.0/apsg/src/tpc/db2z_identitycols.html

Редактировать после комментария:

В случае, если вам нужночтобы получить идентификатор, @Mathias был прав, что это дубликат вопроса .Возможное решение, взятое из этого ответа, будет выглядеть следующим образом:

PreparedStatement result = cnx.prepareStatement(
    "INSERT INTO ARTIST (ORIGIN,ARTIST_NAME) VALUES ('USA','Nirvana')",
    RETURN_GENERATED_KEYS);
int updated = result.executeUpdate();
if (updated == 1) {
    ResultSet generatedKeys = result.getGeneratedKeys();
    if (generatedKeys.next()) {
        int key = generatedKeys.getInt(1);
    }
}

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

0 голосов
/ 08 мая 2019

Вопрос немного отличается от уже отвеченного и требует другого ответа.

ОП гласит: user shouldn't be able to choose their own record id.В этом случае определение столбца должно быть ID_USER INT NOT NULL GENERATED ALWAYS AS IDENTITY, чтобы запретить любое предоставленное пользователем значение.

Имя таблицы не должно быть USER, поскольку это зарезервированное слово.Вместо этого попробуйте USERS.

Оператор вставки не должен вставляться в столбец ID_USER.Как и в примере из другого ответа, в нем должны быть перечислены вставляемые столбцы.Пример ниже:

 INSERT INTO USERS (USERNAME, FORENAME, SURNAME, PASSWORD, USER_TYPE)
   VALUES ('JohnSmith','John', 'Smith', 'apasswrdx67', 3)

ОП хочет вставить сгенерированное значение в другую таблицу с помощью GUI DatabaseManager.Это делается с помощью функции IDENTITY () сразу после вставки этой строки.Например,

 INSERT INTO SOMETABLE (X, Y, Z) VALUES (IDENTITY(), 'some value', 'other value')
...