2010-12-16 15 views
1

Jonathan LefflerInformix 7.3 - 挿入/更新時に現在の日付としてデフォルトの日付列データ型を宣言する

私はInformix 7.3でテーブルを作成しており、挿入と更新時にデフォルトでtodayになるタイムスタンプフィールドが必要です。

テーブルの現在の時刻のデフォルト値を使用して、日付/日時/タイムスタンプの列を定義するにはどうすればよいですか?

column beg_date date{DEF: date academic session/subsession officially begins} 

    comments "" 
    desc "Beginning date." 
    heading "Beg Date" 
    text "Date - Begin" 
    attributes 
(
) 

column upd_date date 
    comments "" 
    desc "Last update date" 
    heading "Last update date" 
    text "Last update date" 
    attributes 
(
) 

デフォルトどうあるべきかについての意見を持っているスキーマファイル内の他の構文もあります。ここでは

は、単純な日付フィールドのフィールド定義であります私はこの機能を持っている他のテーブルについてはわかりませんし、100%サポートされているわけではありませんが、方法があれば私は知りたいと思っています。

私が話題に見つけた唯一の良いリードがhere

誰もが任意のアイデア/ソリューションを持っているのですか?


その他の調査結果:
http://www.4js.com/techdocs/genero/fgl/devel/DocRoot/User/DatabaseSchema.html
Cast Date in Informix

は、私はデフ別のテーブルで見つかったdatetime列タイプがあります:これは私のため&作品をテストしている

column beg_time datetime year to minute 
    comments "" 
    desc "Beginning date and time of period" 
    heading "Beg Time" 
    text "Date/Time - Slot Begin" 
    attributes 
    (
    ) 
{DEF: date and time this group/person may register} 

答えて

7

私はこの質問で使用されているメタ言語を認識していません。そのため、DBMSが可能なものと比べることができません。

CREATE TABLE ExampleDatesAndTimes 
(
    rownumber  SERIAL NOT NULL PRIMARY KEY, 
    date_column DATE DEFAULT TODAY NOT NULL, 
    datetime_yd DATETIME YEAR TO DAY 
        DEFAULT CURRENT YEAR TO DAY NOT NULL, 
    datetime_ys DATETIME YEAR TO SECOND 
        DEFAULT CURRENT YEAR TO SECOND NOT NULL, 
    datetime_hs DATETIME HOUR TO SECOND 
        DEFAULT CURRENT HOUR TO SECOND NOT NULL, 
    payload  VARCHAR(255) NOT NULL 
); 

これはあなたがINSERT操作でそれを指定しない場合は4つの、時間列のそれぞれは、デフォルト値が割り当てられますたテーブル得られます。一方

INSERT INTO ExampleDatesAndTimes(Payload) VALUES ("Hello"); 

を、列を指定すると、指定された値が優先されます。そのDATE値をDATETIME YEAR TO DAY値のように見えるので、私はDBDATE =「Y4MD-」を仮定している:ここで

INSERT INTO ExampleDatesAndTimes 
    VALUES(0, '1066-10-14', '2001-01-01', '2012-11-10 09:08:07', 
      '23:23:21', "Gezundheit"); 

、値が指定されたすべての、そのものが格納された値ですされています。 ISQL Perform(および最も一般的なI4GLプログラム)などのプログラムはすべての列に値を提供し、デフォルトのメカニズムが有効にならないことに注意してください。

トリガーを使用して再生すると、UPDATEの値を変更できるため、日付を挿入して最後に更新された列を作成できます(必要に応じてcreated_by列とupdated_by列を追加できます)。繰り返しますが、明示的に指定された値に対してデフォルト値を心配する必要があります。

IDS 7.3xを使用しているため、1年または2年前にサービスが終了しましたが、IDS 11.70の機能とは少し異なります。あなたはアップグレードを検討する必要があります。


このコードは、最終的に更新時にトリガーで再生するために見つかりました。 2006年の日付です。

CREATE TABLE talx_000 
(
    i  SERIAL NOT NULL PRIMARY KEY, 
    s  CHAR(30) NOT NULL, 
    m_user VARCHAR(32) DEFAULT USER NOT NULL, 
    m_time DATETIME YEAR TO SECOND DEFAULT CURRENT YEAR TO SECOND NOT NULL 
); 
CREATE PROCEDURE current_user_time() 
    RETURNING VARCHAR(32) AS m_user, DATETIME YEAR TO SECOND AS m_time; 
    RETURN user(), CURRENT YEAR TO SECOND - 1 UNITS DAY; 
END PROCEDURE; 

CREATE TRIGGER upd_talx_000 UPDATE ON talx_000 
    REFERENCING NEW AS NEW FOR EACH ROW 
    (EXECUTE PROCEDURE current_user_time() INTO m_user, m_time); 

INSERT INTO talx_000(s) VALUES("cached nonsense"); 
INSERT INTO talx_000(s, m_user) VALUES("inserted user", "sphinx"); 
INSERT INTO talx_000(s, m_time) 
    VALUES("inserted time", DATETIME(1066-10-14 15:23:31) YEAR TO SECOND); 
INSERT INTO talx_000(s, m_time, m_user) 
    VALUES("inserted both", DATETIME(1805-10-21 13:15:00) YEAR TO SECOND, 
      "nelson"); 

SELECT * FROM talx_000; 

DROP TRIGGER upd_talx_000; 

CREATE PROCEDURE upd_talx_000(i_val INTEGER); 
    UPDATE talx_000 
     SET m_user = "brandywine", 
      m_time = DATETIME(3019-03-25 13:00:00) YEAR TO SECOND 
     WHERE i = i_val; 
END PROCEDURE; 

CREATE TRIGGER upd_talx_000 UPDATE ON talx_000 
    REFERENCING NEW AS NEW FOR EACH ROW 
    (EXECUTE PROCEDURE upd_talx_000(NEW.i)); 

INSERT INTO talx_000(s) VALUES("cached nonsense"); 
INSERT INTO talx_000(s, m_user) VALUES("inserted user", "sphinx"); 
INSERT INTO talx_000(s, m_time) 
    VALUES("inserted time", DATETIME(1066-10-14 15:23:31) YEAR TO SECOND); 
INSERT INTO talx_000(s, m_time, m_user) 
    VALUES("inserted both", DATETIME(1805-10-21 13:15:00) YEAR TO SECOND, 
      "nelson"); 

SELECT * FROM talx_000; 

楽しくお楽しみください!

+0

ありがとうございましたjon - ええ、あなたが私が以前持っていたいくつかのinformix質問をアップグレードすることについて私に警告しました。それは私の電話ではありませんが、私はあなたを見ていただきありがとうございます。 meta-langに関する限り、JenzabarはInformix上でSISを構築し、ネイティブプロセスのいくつかは、 – CheeseConQueso

+0

などのように変更されています。追加情報をありがとう - 私はID、影響を受けた領域、実行されたアクションなどを持っています。 ....と私はisqlを介してテスト挿入を行い、日付フィールドには現在の日付が自動的に入力されます。今日私は更新を試み、それはフィールドを変更することに失敗しました – CheeseConQueso

+0

btw - wtfは、hahahahについてのペイロード= "Gezundheit"ですか? – CheeseConQueso

1

- インサート専用。私はあなたが現在の日付に更新するフィールドが必要な場合は、更新ごとにトリガーを更新シナリオを扱うことができることを前提としてい

column use_date date default today not null 
     comments "" 
     desc "Date this use case was executed" 
     heading "Usage date" 
     text "Usage date" 
     attributes 
    (
    ) 
1
TABLE sample 
(
timestamp DATETIME(YEAR TO SECONDS) 
) 


In Informix-SQL Perform screen: 

INSTRUCTIONS 

AFTER EDITADD OF sample.timestamp 
LET screen_tag = CURRENT 

AFTER EDITUPDATE OF sample.timestamp 
LET screen_tag = CURRENT 

注:私は以来、DATEまたはDATETIMEカラムのNULLなし使用することはありませんWITHOUT NULLが一時的な列に指定されている場合、1899年12月31日ではなく、不在の値を持つ方がよいでしょう。

+1

@FComp - 私はあなたのことを聞いていますが、デフォルトでは挿入時に現在の日付が挿入されます。私はレコードを更新しようとしましたが、日付は変わりません。私はトリガは、日付のフィールドの更新は、SQLの最新の日付に更新する必要があると思います – CheeseConQueso

+0

@ QuesoConQueso:あなたはトリガを作成することができますが、あなたはクライアント側でのみ行うことができます場合は、EDITADDテーブルのEDITUPDATE、より良い。 TRIGGERはエンジンに多くのオーバーヘッドをかけているようで、絶対に必要でない限り、私はそれらを避けようとしています。 –

関連する問題