8

属性Transactionを持つというモデルがあるとします。:transaction_codeその属性に、とは異なる可能性のあるシーケンス番号が自動的に入力されるようにしますid(たとえば、Transaction withid=1が持つ可能性がありますtransaction_code=1000)。

postgres でシーケンスを作成してから、そのシーケンスのtransaction_code列のデフォルト値を作成しようとしましたnextval。問題は、on RoR に値を割り当てない場合、@transaction.transaction_codeon RoR を発行する@transaction.saveと、次の SQL を実行しようとすることです。

INSERT INTO transactions (transaction_code) VALUES (NULL);

これが行うことは、シーケンスの nextval を計算して対応する列に挿入する代わりに、transaction_code を NULL にして、Transactions テーブルに新しい行を作成することです。したがって、私が知ったように、postgres に NULL を指定すると、デフォルト値に関係なく、その列に NULL を挿入する必要があると見なされます (動作が異なる ORACLE から来ています)。

データベースまたはRoRで行われる場合、私はこれに関するあらゆる解決策を受け入れます。

  • ActiveRecord から属性を除外する方法があるか save
  • または、トリガーを使用して挿入する前に列の値を変更する方法があります
  • または、RoR 内でこれらのシーケンス番号を生成する方法があります。
  • またはそれが機能する限り、他の方法:-)

前もって感謝します。

4

2 に答える 2

6

今のところ、次のように ROR モデルでシーケンスを取得して割り当てる作業に行き詰まっている可能性があります。

before_create :set_transaction_code_sequence

def set_transaction_code_sequence
  self.transaction_code = self.class.connection.select_value("SELECT nextval('transaction_code_seq')")
end

これをARで直接修正したいので、私はこのソリューションが特に好きではありません...しかし、それはうまくいきます.

于 2012-07-30T23:38:21.240 に答える
2

ステートメントの列にデフォルト値を挿入する場合は、キーワード- 引用符なしを使用できます。INSERTDEFAULT

INSERT INTO mytable (col1, col2) VALUES (105, DEFAULT);

または、あなたの場合、デフォルトを綴ることもできnextval(...)ます。マニュアルはこちらをご覧ください。


その場合のトリガーは単純です。何があっても、シーケンスの数字のみが入力されるようにしたい場合は、実際にこれをお勧めします。

CREATE OR REPLACE FUNCTION trg_myseq()
  RETURNS trigger AS
$BODY$
BEGIN

NEW.mycol := nextval('my_seq');
RETURN NEW;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE;

CREATE TRIGGER myseq
  BEFORE INSERT
  ON mytable
  FOR EACH ROW
  EXECUTE PROCEDURE trg_myseq();

余談ですが、独自の(連続していない)番号を「シーケンス」として割り当てたい場合は、数日前の回答でその解決策を書きました:
postgresqlシーケンスの値のリストを指定する方法

于 2011-10-19T22:38:53.317 に答える