【问题标题】:How should my INSERT INTO statement for GENERATED BY DEFAULT AS IDENTITY be?GENERATED BY DEFAULT AS IDENTITY 的 INSERT INTO 语句应该如何?
【发布时间】:2019-09-25 06:02:32
【问题描述】:

我正在尝试为我的表的记录 ID 使用 GENERATED BY DEFAULT AS IDENTITY 键,因为用户需要自己注册并且用户不应该能够选择自己的记录 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 是我用于我的数据库的内容

【问题讨论】:

  • 新人没问题!感谢您的编辑! :) 您能否发布一些与数据库交互的 Java 代码?我试图理解您在下面的评论,您说您正在使用 UI 执行 INSERT 语句,但您似乎希望 INSERT 中的 ID 在其他地方的另一个 INSERT 中使用。

标签: java jdbc hsqldb


【解决方案1】:

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

OP 声明: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)

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

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

【讨论】:

    【解决方案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。

    【讨论】:

    • 但是我在歌曲表中使用这个 id 作为外键??插入歌曲(ID_SONG,SONG_CODE,SONG_TITLE,GENRE,AVAILABILITY,ID_ALBUM,ID_ARTIST)值('1','S1','Come As You Are','Rock','Available','1','1' );
    • @pofuduktavsancik:那你需要获取插入歌曲后生成的值。查看PreparedStatement.getGeneratedKeys()
    • DB2 Z/OS 手册的链接没有帮助,因为这个问题是针对HSQLDB
    • @a_horse_with_no_name 插入专辑(RELEASED_COUNTRY、RELEASE_YEAR、ALBUM_NAME)值(“USA”、“2000”、“Nirvana Deluxe”);我的 HSQLDB 语句应该是这样的,我需要在 java 代码中生成 key 语句,对吧?
    • 不需要检查更新计数。如果插入成功,你知道只有一行,否则抛出异常。
    猜你喜欢
    • 2018-02-08
    • 2018-05-18
    • 1970-01-01
    • 2013-05-09
    • 2021-09-15
    • 2017-10-13
    • 2011-12-04
    • 2015-02-21
    • 1970-01-01
    相关资源
    最近更新 更多