>

다음 표가있는 postgres 데이터베이스가 있습니다 :

CREATE TABLE stocks 
    (
       id serial PRIMARY KEY
    );

및 다음과 같은 다른 테이블 :

CREATE TABLE stock_attributes 
    (
       id serial PRIMARY KEY,
       market_id TEXT,
       short_name TEXT,
       full_name TEXT,
       isin TEXT,
       stock_id serial REFERENCES stocks(id)
    );

이것은 정규화를 시도한 것이므로 잘못된 경우 용서하십시오.하지만 stocks 에 새 행을 삽입하려고합니다.  표를 입력 한 다음 두 번째 표에 다른 삽입물의 ID를 사용하십시오.

INSERT INTO stocks DEFAULT VALUES RETURNING id;

쿼리가 진행되고 새 ID가 반환되지만 stock_attributes 테이블에서 두 번째 쿼리를 실행하면 관계 ID가 stocks 테이블에 존재하지 않는다는 오류가 발생합니다.

INSERT INTO stock_attributes AS a (market_id, short_name, full_name, isin, stock_id) VALUES (%s, %s, %s, %s, %s);

이것은 실패한다

insert or update on table "stock_attributes" violates foreign key constraint "stock_attributes_stock_id_fkey"
DETAIL:  Key (stock_id)=(3) is not present in table "stocks".

파이썬과 함께 psycopg2를 사용하고 있습니다.

이것은 postgres 파이썬 가이드에서 복사 한 코드입니다 :


def execute(sql,args):
    conn = None
    try:
        # read database configuration
        params = config()
        # connect to the PostgreSQL database
        conn = psycopg2.connect(**params)
        # create a new cursor
        cur = conn.cursor()
        cur.execute(sql, args)
        conn.commit()
        # close communication with the database
        cur.close()
        print("SQL executed")
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()
def execute_and_return(sql, args):
    """ insert a new vendor into the vendors table """
    conn = None
    rows = None
    try:
        # read database configuration
        params = config()
        # connect to the PostgreSQL database
        conn = psycopg2.connect(**params)
        # create a new cursor
        cur = conn.cursor()
        cur.execute(sql, args)
        rows = cur.fetchall()
        # close communication with the database
        cur.close()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()
    return rows

  • 답변 # 1

    stocks 에 대한 주요 참조  테이블이 잘못되었습니다. 당신은 가지고 있습니다 :

    stock_id serial REFERENCES stocks(id)
    
    

    필요할 때 :

    stock_id integer REFERENCES stocks(id)
    
    

    직렬은 integer 유형의 시퀀스를 작성합니다.  열 유형을 integer 로 설정합니다.   nextval("<generated sequence name>") 의 기본값 . serial 에서 유형을 변경하면   integer 로  외래 키에서는 작동해야합니다.

관련 자료

  • 이전 asp.net core - StaticFileExtensions 중 일부를 볼 수 없습니다
  • 다음 android - 애니메이션을 사용하여 큰 제목에서 작은 제목으로 사용자 지정 앱 바를 만드는 방법은 무엇입니까?