sql >> データベース >  >> RDS >> Oracle

表OracleSQLの任意の行で重複する日付を確認します

    このようなトリガーが必要になると思います:

    CREATE OR REPLACE TRIGGER TRGEPOCASNAOSOBREPOSTAS
        AFTER INSERT OR UPDATE
        ON EPOCA
      c INTEGER;
    BEGIN
        SELECT COUNT(*)
        INTO c
        FROM EPOCA e
        WHERE EXISTS (
            SELECT 1
            FROM EPOCA ee 
            WHERE (e.DATA_INI BETWEEN ee.DATA_INI AND ee.DATA_FIM 
                  OR e.DATA_FIM BETWEEN ee.DATA_INI AND ee.DATA_FIM) 
               AND ee.ROWID <> e.ROWID);
    
        IF c > 0 THEN
                RAISE_APPLICATION_ERROR(-20021, 'INSERT FAILED BECAUSE SELECTED DATES OVERLAP EXISTENT ONES');
        END IF;
    END;
    

    FOR EACH ROWに注意してください 節が与えられていません!

    それ以外の場合、トリガーは現在挿入/更新された行のみを実行し、既存のデータとは比較しません。

    次のような場合も検討してください:

    この表では、8月1日から30日までの期間があり、5月1日から12月31日までの期間を追加しようとしています。もちろん、そのような状況もトリガーによってブロックされるべきです。したがって、必要なのはステートメントレベルのトリガーだけです。つまり、挿入/更新された行のみをチェックする行レベルのトリガーでは不十分です。




    1. 列num_rowsでビューを作成します-MySQL

    2. PostgreSQLでエラーを表示

    3. MySQLを使用してPythonに単一列の値を挿入することはできません

    4. MySQLデータベースをPHPWebサイトに接続する方法