我正尝试将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是我在数据库中使用的
答案 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')