2016-04-30 69 views
0

我想在PostgreSQL 9.4表中插入唯一的ID记录。PostgreSQL 9.4表中的唯一ID

INSERT INTO ACCOUNT_HISTORY(ID, ACCOUNT_ID, USERNAME, COMMENT, CREATED) VALUES (?, (select ID from ACCOUNT where USER_NAME = ?), ?, ?, CURRENT_DATE) 

CREATE TABLE ACCOUNT_HISTORY(
ID INTEGER NOT NULL, 
ACCOUNT_ID INTEGER, 
USERNAME TEXT, 
COMMENT TEXT, 
CREATED DATE 
) 
; 

CREATE INDEX IX_RELATIONSHIP8 ON ACCOUNT_HISTORY (ACCOUNT_ID) 
; 

怎样才能为每一个插入查询唯一的ID?

回答

2

使用serial

CREATE TABLE ACCOUNT_HISTORY (
    ID SERIAL, 
    ACCOUNT_ID INTEGER, 
    USERNAME TEXT, 
    COMMENT TEXT, 
    CREATED DATE 
); 

然后,不包括其在insert声明:

INSERT INTO ACCOUNT_HISTORY(ACCOUNT_ID, USERNAME, COMMENT, CREATED) 
    SELECT ID, ?, ?, ?, CURRENT_DATE 
    FROM ACCOUNT 
    WHERE USER_NAME = ?; 

编辑:

如果您在表中有数据(所以你不”不想丢掉它):

create temporary table temp_account_history as 
    select * 
    from account_history; 

drop account_history; 

CREATE TABLE ACCOUNT_HISTORY (
    ID SERIAL, 
    ACCOUNT_ID INTEGER, 
    USERNAME TEXT, 
    COMMENT TEXT, 
    CREATED NOT NULL DEFAULT CURRENT_DATE 
); 

INSERT INTO ACCOUNT_HISTORY(ACCOUNT_ID, USERNAME, COMMENT, CREATED) 
    SELECT ACCOUNT_ID, USERNAME, COMMENT, CREATED 
    FROM TEMP_ACCOUNT_HISTORY; 

请注意,这也给CREATED一个默认值,所以你不必在随后的插入中包含它。

+0

使用此解决方案时,应使用哪种SQL语句进行插入。我如何编辑我的SQL查询? –

+0

@PeterPenzov。 。 。正确重新创建表格。如果表中已有数据,请将其复制到临时表中。删除第一张桌子。重新定义它并将数据重新插入到其中。 –

+0

另一个问题是Oracle数据库的类似解决方案? –