복붙노트

[SQL] 포스트 그레스 테이블 컬럼의 디폴트 값을 얻을?

SQL

포스트 그레스 테이블 컬럼의 디폴트 값을 얻을?

나는 포스트 그레스의 테이블의 컬럼의 디폴트 값을 찾기 위해 쿼리를 실행하는 방법을 찾고 있어요. 예를 들어, 나는 다음과 같은 쿼리 테이블을 만든 경우 :

** 편집자 주 :이 질문에 아무런 영향을주지 않습니다 나는 테이블 정의를 수정했습니다.

CREATE TABLE mytable (
    integer int DEFAULT 2,
    text varchar(64) DEFAULT 'I am default',
    moretext varchar(64) DEFAULT 'I am also default',
    unimportant int 
);

나는 정수의 기본이 2 즉, 텍스트가 '나는 기본이다', 그리고 moretext는 '나는 기본도이다'입니다, 어떤 형식으로 말해 것이다 쿼리를해야합니다. 쿼리 결과가 즉 기본이없는 다른 컬럼에 대한 모든 값을 포함 할 수 있습니다, 중요하지 않은 나의 목적을 위해 중요하고 전혀 문제가되지 않습니다.

해결법

  1. ==============================

    1.정보 스키마를 사용합니다 :

    정보 스키마를 사용합니다 :

    SELECT column_name, column_default
    FROM information_schema.columns
    WHERE (table_schema, table_name) = ('public', 'mytable')
    ORDER BY ordinal_position;
    
     column_name │             column_default             
    ─────────────┼────────────────────────────────────────
     integer     │ 2
     text        │ 'I am default'::character varying
     moretext    │ 'I am also default'::character varying
     unimportant │ 
    (4 rows)
    

    스키마 이름까지,이 모든 SQL 데이터베이스 시스템에서 작동합니다.

  2. ==============================

    2.시스템 카탈로그는 포스트 그레스에서 진리의 근원이다 :

    시스템 카탈로그는 포스트 그레스에서 진리의 근원이다 :

    SELECT pg_get_expr(d.adbin, d.adrelid) AS default_value
    FROM   pg_catalog.pg_attribute    a
    LEFT   JOIN pg_catalog.pg_attrdef d ON (a.attrelid, a.attnum) = (d.adrelid,  d.adnum)
    WHERE  NOT a.attisdropped           -- no dropped (dead) columns
    AND    a.attnum   > 0               -- no system columns
    AND    a.attrelid = 'myschema.mytable'::regclass
    AND    a.attname  = 'mycolumn';
    

    LEFT는 한 컬럼이 존재하는 보장을 결과 가입하세요. 기본 기본값으로 발생 - 기본값이없는 경우에는 NULL을 얻는다. 그리고 거의 항상 수정합니다. 그러나 참조 :

    기본적없이 열을 제외하려면, 사용하는 대신 가입하고 가끔씩 행을 얻을 수 있도록 준비.

    특수 주조 :: regclass 형은 search_path의 현재 설정을 고려하고있다. 검증을 거친 스키마 (당신이 확실하게해야한다!)하지 않은 이름으로, 당신은 또는 예상 결과를 얻을 수도 있고 그렇지 않을 수도 있습니다. 아래의 반박을 참조하십시오. 매뉴얼에 더. 관련 :

    우리는 테이블의 OID를 일단 필요가 pg_class을 포함 없습니다. 빠른없이.

    @ Zohaib의 쿼리는 거의 아니지만 꽤 권리입니다. 문제의 몇 가지 있습니다. 나는 미래의 참조를 위해 여기 복사됩니다. 이를 사용하지 마십시오 :

    SELECT adsrc as default_value
     FROM pg_attrdef pad, pg_atttribute pat, pg_class pc
     WHERE pc.relname='your_table_name'
         AND pc.oid=pat.attrelid AND pat.attname='your_column_name'
         AND pat.attrelid=pad.adrelid AND pat.attnum=pad.adnum
    

    그것을 요약하면 : C / P를 일부 블로그에서 통찰력이 위험 잘못없이.

  3. ==============================

    3.나는 어윈의 답변을 좋아하지만, 몇 가지 어려움을 겪고 있었다 :

    나는 어윈의 답변을 좋아하지만, 몇 가지 어려움을 겪고 있었다 :

    내가 전에 무엇을하고 있었는지 되돌아 가게되었다 그래서 :

    BEGIN;
    INSERT INTO mytable DEFAULT VALUES RETURNING *;
    ROLLBACK;
    

    여기서주의 할 점은 어떤 SERIAL 열이 증가 얻을 것입니다. 그것은 가능성이 너무 오래 그냥 테이블 인덱스의 경우는 고유으로 중요하지 않습니다. 그렇지 않으면 계약 위반이다.

    조심하는 다른 것은 어떤 트리거 AFTER가 / INSERT 전에 반드시 INSERT 다시 압연 도착하더라도 해고되는 것입니다 (내가 어떤 트리거 기능 차종 그래도 롤백 얻을 것이다 변경 생각합니다.)

  4. ==============================

    4.나는 pg_catalog 테이블 그립에 도착하려고 시간을 소비하고있다. 나는 이름을 믿고있어 이러한 다시 편지를 모든 삶의 사실이 개별적으로 조각 할 수 있었고, 어쨌든 ;-), 결과적으로 매우 비싼했던 일에서 온다. 나는이 스레드에 열 및 실행 된 기본값을 얻고 싶었다. 나는 함수로 어윈 Brandstetter의 코드를 가지고 싶은의 언급을 보았다. 나는 그것을 싸서 내가 아카이브에 추가 거라고 생각했습니다 :

    나는 pg_catalog 테이블 그립에 도착하려고 시간을 소비하고있다. 나는 이름을 믿고있어 이러한 다시 편지를 모든 삶의 사실이 개별적으로 조각 할 수 있었고, 어쨌든 ;-), 결과적으로 매우 비싼했던 일에서 온다. 나는이 스레드에 열 및 실행 된 기본값을 얻고 싶었다. 나는 함수로 어윈 Brandstetter의 코드를 가지고 싶은의 언급을 보았다. 나는 그것을 싸서 내가 아카이브에 추가 거라고 생각했습니다 :

    CREATE OR REPLACE FUNCTION data.column_default (qualified_name text, column_name text)
      RETURNS text
     AS $$
    
    SELECT d.adsrc AS default_value -- A human-readable representation of the default value, already typed as text.
    FROM   pg_catalog.pg_attribute a
    LEFT   JOIN pg_catalog.pg_attrdef d ON (a.attrelid, a.attnum)
                                         = (d.adrelid,  d.adnum)
    WHERE  NOT a.attisdropped   -- no dropped (dead) columns
    AND    a.attnum > 0         -- no system columns
    AND    a.attrelid = qualified_name::regclass
    AND    a.attname = column_name;
    
    $$ LANGUAGE sql;
    
    ALTER FUNCTION data.column_default (qualified_name text, column_name text) OWNER TO user_bender;
    

    나는 (아마도 비인간적 인 방식으로) 코드과 같이 사용하고 있습니다 :

    select pg_class.relnamespace::regnamespace as schema_name,
            attrelid::regclass as parent_name,
            attname,
           format_type(atttypid, atttypmod) as data_type,
           column_default(attrelid::regclass::text,attname),
           attnum
    
     from pg_attribute
     left join pg_class on (pg_class.oid = pg_attribute.attrelid::regclass)
    

    여기에서 나는 더 나은 내가 정말 후 해요 알고 나면 나는 등,보기를 쓸 것이다 그림. 지금, 나는 임시보기로 CTE를 사용하고 있습니다 :

    with attributes as
    (select pg_class.relnamespace::regnamespace as schema_name,
            attrelid::regclass as parent_name,
            attname,
           format_type(atttypid, atttypmod) as data_type,
           column_default(attrelid::regclass::text,attname),
           attnum
    
     from pg_attribute
     left join pg_class on (pg_class.oid = pg_attribute.attrelid::regclass)
    )
    
    select *
      from attributes
     where parent_name::text = 'sales'
    

    수정, 개선 및 제안 모두 환영 ... 난 그냥 내 발 pg_catalog에 젖은 얻고있다.

  5. ==============================

    5.

     SELECT adsrc as default_value
     FROM pg_attrdef pad, pg_atttribute pat, pg_class pc
     WHERE pc.relname='your_table_name'
         AND pc.oid=pat.attrelid AND pat.attname='your_column_name'
         AND pat.attrelid=pad.adrelid AND pat.attnum=pad.adnum
    

    나는 블로그 중 하나에 PostgreSQL를위한이 쿼리를 발견했다. 당신은 그것이 작동하는지 확인하려면이 시도 할 수 있습니다. 모든 coumns의 값을 얻으려면 = 'your_column_name이'에서 절을 제거하고 pat.attname 시도 할 수 있습니다.

  6. ==============================

    6.

    you can just type " \d table_name" command , then It will displays some information about the
    

    테이블, 컬럼의 디폴트 값 등.

    --create 테이블

    skytf=> CREATE TABLE mytable (
    skytf(>     a integer DEFAULT 2,
    skytf(>     b varchar(64)  DEFAULT 'I am default',
    skytf(>     c varchar(64)  DEFAULT 'I am also default'
    skytf(> );
    CREATE TABLE
    

    --show 테이블 정보

    skytf=> \d mytable
                                  Table "skytf.mytable"
     Column |         Type          |                   Modifiers                    
    --------+-----------------------+------------------------------------------------
     a      | integer               | default 2
     b      | character varying(64) | default 'I am default'::character varying
     c      | character varying(64) | default 'I am also default'::character varying
    
  7. from https://stackoverflow.com/questions/8146448/get-the-default-values-of-table-columns-in-postgres by cc-by-sa and MIT license