我的GENERATED BY DEFAULT AS IDENTITY的INSERT INTO语句应该如何?

时间:2019-05-07 14:29:22

标签: java jdbc hsqldb

我正尝试将GENERATED BY DEFAULT AS IDENTITY键用于表的记录ID,因为用户需要自行注册,并且用户不能选择自己的记录ID。因此,我决定使用GENERATED BY DEFAULT AS 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)
);

,用户将被允许注册自己。

This是我在数据库中使用的

2 个答案:

答案 0 :(得分:2)

当表中的列由DEFAULT AS IDENTITY生成时,这意味着您可以在该列中插入值,而不必拥有。因此,在您的插入内容中,您可以改写

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

评论后编辑:

在需要检索ID的情况下,@ Mathias正确地说这是duplicate question。从该答案中得出的可能解决方案是:

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拥有下一个查询所需的ID。

答案 1 :(得分:0)

该问题与已经回答的问题略有不同,需要不同的答案。

OP指出:user shouldn't be able to choose their own record id。在这种情况下,列定义应为ID_USER INT NOT NULL GENERATED ALWAYS AS IDENTITY,以禁止用户提供任何值。

表名不应为USER,因为这是保留字。尝试使用USERS

insert语句不应插入ID_USER列中。与其他答案中的示例类似,它应列出要插入的列。下面的示例:

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

OP希望使用GUI DatabaseManager将生成的值插入到另一个表中。这是通过在插入该行后立即使用IDENTITY()函数来完成的。例如,

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