2017-01-11 15 views
2

MSSQLをバックエンドとして使用するアプリケーションがあります。今私はPostgreSQLを使用できるようにコードを開発しています。実行この1差がある以外、私はほとんどそれを完了している:PostgresにSQL Serverのidentity列を作成する方法

新しいアプリケーションを保存し、

SQL Serverコード:

create table tower 
(
    npages integer, 
    ifnds integer, 
    ifnid integer, 
    name varchar(20), 
    towid integer not null IDENTITY 
) 

PostgreSQLのコード:

create table tower 
(
    npages integer, 
    ifnds integer, 
    ifnid integer, 
    name varchar(20) 
) 

PostgreSQLを使用して実行すると、towidフィールド(デフォルトフィールド)が自動的に生成されないのはなぜですか?

考えられる理由はありますか?トリガー?手続き?

+1

使用は 'のPostgresにNULL'ないシリアルtowid:https://www.postgresql.org/docs/current/static/datatype- numeric.html#DATATYPE-SERIAL –

答えて

1

PostgreSQLは、要求したとおりにテーブルを作成します。自動的にいくつかの列が生成されることはありません(ほとんど、しかしこれは低レベルです)。あなたの要求にtowid serial primary keyを追加する必要があります。

+0

Ok ...しかし、towidフィールドを生成するためのSQLのコードはありません...プロシージャなどで生成されるでしょうか? –

+1

@AnuShibinJosephRaj: 'serial'は' identity'と同じことです。詳細は、マニュアルを参照してください:https://www.postgresql.org/docs/current/static/datatype-numeric.html#DATATYPE-SERIAL –

+1

PostgreSQLのタイプ 'serial'または' bigserial'は、 'IDENTITY'タイプの良い代用品です。 T-SQLユニークな値を保証し、わかりやすい値を与えます。 IDENTITYはときどきちょっと変わった動作をすることがあります.... – JosMac

3

TL; Postgresの10で今DR

は、SQL標準に従ってGENERATED BY DEFAULT AS IDENTITYを指定します。

create table tower 
(
    npages integer, 
    ifnds integer, 
    ifnid integer, 
    name varchar(20), 
    towid integer GENERATED BY DEFAULT AS IDENTITY -- per SQL standard 
) 

ID列

Postgresの10は今identity columnの概念をサポートし、標準のSQL構文を使用しています。私はMS SQL Serverの専門家ではありませんが、この新しい標準サポートは同等であると私は信じています。 CREATE TABLE中に使用

GENERATED … AS IDENTITY

GENERATED … AS IDENTITYコマンドは、暗黙的シーケンスを生成します。 SERIALとは異なり、そのシーケンスの作成、命名、許可、および削除はあなたには透過的です。非常に直感的です。テーブルへの使用許可を与えると、シーケンスに対する許可を得ます。表をドロップすると、シーケンスは自動的にドロップされます。

標準構文の2つの味です。その違いは、値を生成させるのではなく、値を渡す場合にのみ重要です。通常、人々は常に生成された価値に頼っているので、通常は最初のバージョンGENERATED BY DEFAULT AS IDENTITYを使用します。

  • GENERATED BY DEFAULT AS IDENTITY
    • INSERTコマンドが値を提供しない限り、値を生成します。
  • GENERATED ALWAYS AS IDENTITY
    • ドキュメントについてCREATE TABLEページを参照してくださいOVERRIDING SYSTEM VALUE

を指定しない限り、INSERTが提供する任意の値を無視します。

Read this interesting page Peter Eisentrautによる。彼はSERIALで奇妙な問題を説明します。新しいID列機能にはこのような問題はありません。だから、もう使用する理由はありません.、悪い面もなく、悪い面もあります。 SERIALは、GENERATED … AS IDENTITYに置き換えられます。

ID列は、必ずしも主キーである必要はなく、自動的には索引付けされないことに注意してください。だからあなたが意図している場合は、明示的にPRIMARY KEYを指定する必要があります(通常はそうであるように)。

CREATE TABLE person_ (

    id_ 
     INTEGER 
     GENERATED BY DEFAULT AS IDENTITY -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT. 
     PRIMARY KEY      -- Creates index. Specifies UNIQUE. Marks column for relationships. 
     , 

    name_ 
     VARCHAR(80) 

) ; 

内部実装の詳細を非表示にすることを意図しています。カバーの下に生成されるシーケンスの名前を知る必要はありません。たとえば、列を介してカウンターをリセットするには、基本的なシーケンスを知らなくてもかまいません。暗黙

ALTER TABLE person_ 
    ALTER COLUMN id_ 
    RESTART WITH 1000  -- Reset sequence implicitly, without a name. 
; 

指定アイデンティティ:

  • マーク列NOT NULL
  • は、配列のタイプは、列(32ビット、64ビット等と一致
    • 配列を作成します)
  • ネクタイ
  • は列が
  • の名前を変更した場合でも、列に縛られたまま落下塔へのシーケンス
    • 継承権限
    • カスケードは、デフォルトのソースとして順序を指定します。その列の値

    ID列はCREATE SEQUENCEと同じオプションを取ることができます:

    • START WITH start
    • MINVALUE minvalue | NO MINVALUE
    • MAXVALUE maxvalue | NO MAXVALUE
    • CYCLE | 4行を追加

      id_ INTEGER 
      GENERATED BY DEFAULT AS IDENTITY ( 
          START WITH 200 
          MINVALUE 100 
          MAXVALUE 205 
          CYCLE 
          INCREMENT BY 3 
      ) PRIMARY KEY 
      

      NO CYCLE

    • CACHEキャッシュ
    • OWNED BY NONE
      (所有権が自動的に管理されてID列の指定所有権は私には意味をなさない)

    オプションの愚かな例:

  • 関連する問題